etc./StackOverFlow

JavaScript에서 임의의 문자열/문자 생성

청렴결백한 만능 재주꾼 2021. 11. 25. 06:53
반응형

질문자 :Tom Lehman


[a-zA-Z0-9] 세트에서 무작위로 선택된 문자로 구성된 5개의 문자열을 원합니다.

JavaScript로 이를 수행하는 가장 좋은 방법은 무엇입니까?



나는 이것이 당신을 위해 일할 것이라고 생각합니다.

 function makeid(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for ( var i = 0; i < length; i++ ) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } console.log(makeid(5));


csharptest.net

 //Can change 7 to 2 for longer results. let r = (Math.random() + 1).toString(36).substring(7); console.log("random", r);

참고: 위의 알고리즘에는 다음과 같은 약점이 있습니다.

  • 부동 소수점을 문자열화할 때 후행 0이 제거된다는 사실 때문에 0에서 6자 사이에서 생성됩니다.
  • 그것은 끔찍하게 복잡한 부동 소수점 숫자를 문자열화하는 데 사용되는 알고리즘에 크게 의존합니다. ("부동 소수점 숫자를 정확하게 인쇄하는 방법" 문서 참조)
  • Math.random() 은 구현에 따라 예측 가능한("임의처럼 보이지만 실제로는 무작위가 아닌)" 출력을 생성할 수 있습니다. 결과 문자열은 고유성 또는 예측 불가능성을 보장해야 하는 경우 적합하지 않습니다.
  • 6개의 균일하게 무작위적이고 예측할 수 없는 문자를 생성하더라도 생일 역설 로 인해 약 50,000개의 문자열만 생성한 후에 중복을 볼 수 있습니다. (제곱미터(36^6) = 46656)

doubletap

Math.random 은 이런 종류의 일에 좋지 않습니다.

옵션 1

이 서버 측에서 할 수 있다면 암호화 모듈을 사용하십시오.

 var crypto = require("crypto"); var id = crypto.randomBytes(20).toString('hex'); // "bb5dc8842ca31d4603d6aa11448d1654"

결과 문자열은 생성한 임의 바이트의 두 배입니다. 16진수로 인코딩된 각 바이트는 2자입니다. 20바이트는 40자의 16진수입니다.


옵션 2

이 클라이언트 측을 수행해야 하는 경우 uuid 모듈을 사용해 보십시오.

 var uuid = require("uuid"); var id = uuid.v4(); // "110ec58a-a0f2-4ac4-8393-c866d813b8d1"

옵션 3

클라이언트 측을 수행해야 하고 이전 브라우저를 지원할 필요가 없는 경우 종속성 없이 수행할 수 있습니다.

 // dec2hex :: Integer -> String // ie 0-255 -> '00'-'ff' function dec2hex (dec) { return dec.toString(16).padStart(2, "0") } // generateId :: Integer -> String function generateId (len) { var arr = new Uint8Array((len || 40) / 2) window.crypto.getRandomValues(arr) return Array.from(arr, dec2hex).join('') } console.log(generateId()) // "82defcf324571e70b0521d79cce2bf3fffccd69" console.log(generateId(20)) // "c1a050a4cd1556948d41"


crypto.getRandomValues 에 대한 자세한 내용은 -

crypto.getRandomValues() 메서드를 사용하면 암호학적으로 강력한 임의 값을 얻을 수 있습니다. 매개변수로 주어진 배열은 난수(암호학적 의미에서 난수)로 채워집니다.

다음은 작은 콘솔 예입니다.

 > var arr = new Uint8Array(4) # make array of 4 bytes (values 0-255) > arr Uint8Array(4) [ 0, 0, 0, 0 ] > window.crypto Crypto { subtle: SubtleCrypto } > window.crypto.getRandomValues() TypeError: Crypto.getRandomValues requires at least 1 argument, but only 0 were passed > window.crypto.getRandomValues(arr) Uint8Array(4) [ 235, 229, 94, 228 ]

IE11 지원을 위해 다음을 사용할 수 있습니다.

 (window.crypto || window.msCrypto).getRandomValues(arr)

브라우저 적용 범위는 https://caniuse.com/#feat=getrandomvalues를 참조하십시오.


Mulan

짧고 쉽고 신뢰할 수 있음

여기에 있는 일부 최고 평점 답변과 달리 정확히 5개의 임의 문자를 반환합니다.

 Math.random().toString(36).substr(2, 5);

Silver Ringvee

다음은 doubletap의 우수한 답변 에 대한 개선 사항입니다. 원본에는 여기에서 해결되는 두 가지 단점이 있습니다.

첫째, 다른 사람들이 언급했듯이 짧은 문자열 또는 빈 문자열(난수가 0인 경우)을 생성할 가능성이 적기 때문에 응용 프로그램이 중단될 수 있습니다. 해결책은 다음과 같습니다.

 (Math.random().toString(36)+'00000000000000000').slice(2, N+2)

둘째, 원본과 위의 솔루션 모두 문자열 크기 N을 16자로 제한합니다. 다음은 모든 N에 대해 크기가 N인 문자열을 반환합니다(그러나 N > 16을 사용한다고 해서 무작위성이 증가하거나 충돌 확률이 감소하지는 않습니다).

 Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)

설명:

  1. [0,1) 범위, 즉 0(포함)과 1(제외) 사이의 난수를 선택합니다.
  2. 숫자를 0-9 및 az를 사용하여 base-36 문자열로 변환합니다.
  3. 0으로 채우십시오(첫 번째 문제 해결).
  4. 선행 '0'을 잘라냅니다. 접두사 및 추가 패딩 0.
  5. (구분자로 사용되는 더 짧은 임의의 문자열과 빈 문자열을 결합하여) 최소한 N개의 문자가 포함되도록 문자열을 충분히 반복합니다.
  6. 문자열에서 정확히 N 문자를 슬라이스합니다.

추가 생각:

  • 이 솔루션은 대문자를 사용하지 않지만 거의 모든 경우(말장난 없음) 중요하지 않습니다.
  • 원래 답변의 N = 16에서 최대 문자열 길이는 Chrome에서 측정됩니다. Firefox에서는 N = 11입니다. 그러나 설명된 대로 두 번째 솔루션은 임의성을 추가하는 것이 아니라 요청된 문자열 길이를 지원하는 것이므로 큰 차이가 없습니다.
  • 반환된 모든 문자열은 적어도 Math.random()에 의해 반환된 결과가 고르게 분포되어 있는 한 반환될 확률이 동일합니다(어쨌든 이것은 암호화 강도의 무작위성이 아닙니다).
  • 크기가 N인 가능한 모든 문자열이 반환되는 것은 아닙니다. 두 번째 솔루션에서는 이것이 분명하지만(더 작은 문자열이 단순히 복제되기 때문에), base-36으로 변환할 때 마지막 몇 비트가 원래 임의 비트의 일부가 아닐 수 있기 때문에 원래 답변에서도 마찬가지입니다. 특히 Math.random().toString(36)의 결과를 보면 마지막 문자가 고르게 분포되지 않은 것을 알 수 있습니다. 다시 말하지만, 거의 모든 경우에 중요하지 않지만 짧은 문자열(예: N=1)이 영향을 받지 않도록 임의 문자열의 끝이 아닌 시작 부분에서 최종 문자열을 슬라이스합니다.

업데이트:

여기에 내가 생각해 낸 몇 가지 다른 기능적인 스타일의 원 라이너가 있습니다. 다음과 같은 점에서 위의 솔루션과 다릅니다.

  • 그들은 명시적인 임의의 알파벳을 사용합니다(더 일반적이고 대문자와 소문자를 모두 요구하는 원래 질문에 적합함).
  • 길이가 N인 모든 문자열은 반환될 확률이 동일합니다(즉, 문자열에 반복이 포함되지 않음).
  • 그것들은 toString(36) 트릭이 아니라 맵 함수를 기반으로 하므로 더 간단하고 이해하기 쉽습니다.

그래서, 당신이 선택한 알파벳이

 var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

그런 다음 이 두 가지는 서로 동일하므로 더 직관적인 것을 선택할 수 있습니다.

 Array(N).join().split(',').map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');

그리고

 Array.apply(null, Array(N)).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');

편집하다:

qubyteMartijn de Milliano 가 후자와 유사한 솔루션을 제시한 것 같습니다(공감!). 한눈에 봐도 짧아보이지 않으니 혹시라도 정말 원 라이너를 원하시는 분이 계실까 해서 여기 남겨둡니다 :-)

또한 모든 솔루션에서 'new Array'를 'Array'로 대체하여 몇 바이트를 더 줄였습니다.


amichair

slice substring 보다 짧기 때문에 가장 컴팩트한 솔루션입니다. random 함수에 의해 생성된 부동 소수점 기호를 피할 수 있습니다.

 Math.random().toString(36).slice(-5);

또는

 (+new Date).toString(36).slice(-5);

업데이트: btoa 메서드를 사용하여 접근 방식을 하나 더 추가했습니다.

 btoa(Math.random()).slice(0, 5); btoa(+new Date).slice(-7, -2); btoa(+new Date).substr(-7, 5); 

 // Using Math.random and Base 36: console.log(Math.random().toString(36).slice(-5)); // Using new Date and Base 36: console.log((+new Date).toString(36).slice(-5)); // Using Math.random and Base 64 (btoa): console.log(btoa(Math.random()).slice(0, 5)); // Using new Date and Base 64 (btoa): console.log(btoa(+new Date).slice(-7, -2)); console.log(btoa(+new Date).substr(-7, 5));


Valentin Podkamennyi

es6 스프레드 연산자가 있는 최신 버전:

[...Array(30)].map(() => Math.random().toString(36)[2]).join('')

  • 30 은 임의의 숫자이며 원하는 토큰 길이를 선택할 수 있습니다.
  • 36 은 numeric.toString() 에 전달할 수 있는 최대 기수입니다. 이는 모든 숫자와 az 소문자를 의미합니다.
  • 2 는 다음과 같은 임의의 문자열에서 세 번째 인덱스를 선택하는 데 사용됩니다. "0.mfbiohx64i" 0. 이후의 모든 인덱스를 사용할 수 있습니다.

Or Duan

이와 같은 것이 작동해야합니다.

 function randomString(len, charSet) { charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var randomString = ''; for (var i = 0; i < len; i++) { var randomPoz = Math.floor(Math.random() * charSet.length); randomString += charSet.substring(randomPoz,randomPoz+1); } return randomString; }

기본 문자 세트 [a-zA-Z0-9]로 호출하거나 직접 보내십시오.

 var randomValue = randomString(5); var randomValue = randomString(5, 'PICKCHARSFROMTHISSET');

CaffGeek

 function randomstring(L) { var s = ''; var randomchar = function() { var n = Math.floor(Math.random() * 62); if (n < 10) return n; //1-10 if (n < 36) return String.fromCharCode(n + 55); //AZ return String.fromCharCode(n + 61); //az } while (s.length < L) s += randomchar(); return s; } console.log(randomstring(5));


kennebec

임의 문자열 생성기(영숫자 | 영숫자 | 숫자)

 /** * Pseudo-random string generator * http://stackoverflow.com/a/27872144/383904 * Default: return a random alpha-numeric string * * @param {Integer} len Desired length * @param {String} an Optional (alphanumeric), "a" (alpha), "n" (numeric) * @return {String} */ function randomString(len, an) { an = an && an.toLowerCase(); var str = "", i = 0, min = an == "a" ? 10 : 0, max = an == "n" ? 10 : 62; for (; i++ < len;) { var r = Math.random() * (max - min) + min << 0; str += String.fromCharCode(r += r > 9 ? r < 36 ? 55 : 61 : 48); } return str; } console.log(randomString(10)); // ie: "4Z8iNQag9v" console.log(randomString(10, "a")); // ie: "aUkZuHNcWw" console.log(randomString(10, "n")); // ie: "9055739230"


위에서 원하는 A/N, A, N 출력에 대한 추가 검사를 사용하지만 더 나은 이해를 위해 필수 항목(영숫자만 해당)으로 분류해 보겠습니다.

  • 인수(임의의 문자열 결과의 원하는 길이)를 받는 함수를 만듭니다.
  • var str = ""; 와 같은 빈 문자열을 만듭니다. 임의의 문자를 연결하려면
  • 루프 내부에서 0에서 61 사이의 rand 인덱스 번호 를 만듭니다(0..9+A..Z+a..z = 62).
  • rand (0..61이므로)를 조정/수정 하는 조건부 논리 CharCode 번호와 관련 문자를 다시 가져오기 위해 몇 가지 숫자(아래 예 참조)를 증가시킵니다.
  • 루프 내에서 str a String.fromCharCode( incremented rand )

ASCII 문자 테이블 범위를 상상해 보겠습니다.

 _____0....9______A..........Z______a..........z___________ Character | 10 | | 26 | | 26 | Tot = 62 characters 48....57 65..........90 97..........122 CharCode ranges

Math.floor( Math.random * 62 ) 0..61 (필요한 것)의 범위를 제공합니다.
올바른 charCode 범위 를 얻기 위해 random을 수정합시다.

 | rand | charCode | (0..61)rand += fix = charCode ranges | ------+----------+----------+--------------------------------+-----------------+ 0..9 | 0..9 | 48..57 | rand += 48 = 48..57 | A..Z | 10..35 | 65..90 | rand += 55 /* 90-35 = 55 */ = 65..90 | a..z | 36..61 | 97..122 | rand += 61 /* 122-61 = 61 */ = 97..122 |

위 표의 조건부 연산 논리:

 rand += rand>9 ? ( rand<36 ? 55 : 61 ) : 48 ; // rand += true ? ( true ? 55 else 61 ) else 48 ;

위의 설명에서 결과 영숫자 스니펫은 다음과 같습니다.

 function randomString(len) { var str = ""; // String result for (var i = 0; i < len; i++) { // Loop `len` times var rand = Math.floor(Math.random() * 62); // random: 0..61 var charCode = rand += rand > 9 ? (rand < 36 ? 55 : 61) : 48; // Get correct charCode str += String.fromCharCode(charCode); // add Character to str } return str; // After all loops are done, return the concatenated string } console.log(randomString(10)); // ie: "7GL9F0ne6t"

또는 다음을 수행할 경우:

 const randomString = (n, r='') => { while (n--) r += String.fromCharCode((r=Math.random()*62|0, r+=r>9?(r<36?55:61):48)); return r; }; console.log(randomString(10))


Roko C. Buljan

가장 간단한 방법은 다음과 같습니다.

 (new Date%9e6).toString(36)

이것은 현재 시간을 기준으로 5자의 임의 문자열을 생성합니다. 예제 출력은 4mtxj 또는 4mv90 또는 4mwp1

이것의 문제는 동일한 초에 두 번 호출하면 동일한 문자열을 생성한다는 것입니다.

더 안전한 방법은 다음과 같습니다.

 (0|Math.random()*9e6).toString(36)

이것은 항상 다른 4 또는 5자의 임의의 문자열을 생성합니다. 예제 출력은 30jzm 또는 1r591 또는 4su1a

두 가지 방법 모두에서 첫 번째 부분은 난수를 생성합니다. .toString(36) 부분은 숫자를 base36(영숫자) 표현으로 캐스팅합니다.


MasqueradeCircus

요구 사항 [a-zA-Z0-9] 및 길이=5를 충족하려면 사용

 btoa(Math.random()).substr(10, 5);

소문자, 대문자 및 숫자가 나타납니다.


Sergio Cabral

다음은 쉬운 원 라이너입니다. 길이를 설정하려면 new Array(5) 를 변경하십시오.

0-9a-z 포함

 new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36);})

0-9a-zA-Z

 new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36)[Math.random()<.5?"toString":"toUpperCase"]();});

bendytree

모두가 이미 옳았다는 것을 알고 있지만 가능한 한 가장 가벼운 방법(CPU가 아닌 코드에 대한 빛)으로 이것을 해보고 싶은 생각이 들었습니다.

 function rand(length, current) { current = current ? current : ''; return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current; } console.log(rand(5));

머리를 감는 데는 약간의 시간이 걸리지만 자바스크립트 구문이 얼마나 멋진지 보여주는 것 같습니다.


Roderick

누군가가 한 번에 메모리를 할당하는 단일 라이너(편의상 그렇게 형식화되지는 않았지만)에 관심이 있는 경우(그러나 작은 문자열의 경우 실제로는 중요하지 않음) 수행 방법은 다음과 같습니다.

 Array.apply(0, Array(5)).map(function() { return (function(charset){ return charset.charAt(Math.floor(Math.random() * charset.length)) }('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')); }).join('')

5 를 원하는 문자열 길이로 바꿀 수 있습니다. Array(5) 의해 생성된 희소 배열에서 작동하지 않는 map 기능에 대한 솔루션에 대해 이 게시물의 @AriyaHidayat에게 감사드립니다.


Martijn de Milliano

Lodash 또는 Underscore 를 사용하는 경우 매우 간단합니다.

 var randomVal = _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 5).join('');

vineet

안전한 임의의 영숫자 Base-62 문자열을 생성합니다.

 function generateUID(length) { return window.btoa(Array.from(window.crypto.getRandomValues(new Uint8Array(length * 2))).map((b) => String.fromCharCode(b)).join("")).replace(/[+/]/g, "").substring(0, length); } console.log(generateUID(22)); // "yFg3Upv2cE9cKOXd7hHwWp" console.log(generateUID(5)); // "YQGzP"


gogo

여기 내가 만든 방법이 있습니다.
대문자와 소문자를 모두 포함하는 문자열을 생성합니다.
또한 영숫자 문자열도 생성하는 함수를 포함했습니다.

작업 예:
http://jsfiddle.net/greatbigmassive/vhsxs/ (알파 전용)
http://jsfiddle.net/greatbigmassive/PJwg8/ (영숫자)

 function randString(x){ var s = ""; while(s.length<x&&x>0){ var r = Math.random(); s+= String.fromCharCode(Math.floor(r*26) + (r>0.5?97:65)); } return s; }

2015년 7월 업그레이드
이것은 동일한 작업을 수행하지만 더 의미가 있고 모든 문자를 포함합니다.

 var s = ""; while(s.length<x&&x>0){ v = Math.random()<0.5?32:0; s += String.fromCharCode(Math.round(Math.random()*((122-v)-(97-v))+(97-v))); }

Adam

const c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' const s = [...Array(5)].map(_ => c[~~(Math.random()*c.length)]).join('')

Nahuel Greco

위의 @Andrew의 답변을 개선했습니다.

 Array.from({ length : 1 }, () => Math.random().toString(36)[2]).join('');

난수의 기본 36 변환은 일관성이 없으므로 단일 인덱스를 선택하면 수정됩니다. 원하는 정확한 길이로 문자열의 길이를 변경할 수 있습니다.


Zee

underscorejs 를 사용한다고 가정하면 단 두 줄로 임의의 문자열을 우아하게 생성할 수 있습니다.

 var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var random = _.sample(possible, 5).join('');

tiktak

짧막 한 농담:

 Array(15).fill(null).map(() => Math.random().toString(36).substr(2)).join('') // Outputs: 0h61cbpw96y83qtnunwme5lxk1i70a6o5r5lckfcyh1dl9fffydcfxddd69ada9tu9jvqdx864xj1ul3wtfztmh2oz2vs3mv6ej0fe58ho1cftkjcuyl2lfkmxlwua83ibotxqc4guyuvrvtf60naob26t6swzpil

arkadyt

빠르고 향상된 알고리즘. 유니폼을 보장하지 않습니다(코멘트 참조).

 function getRandomId(length) { if (!length) { return ''; } const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let array; if ('Uint8Array' in self && 'crypto' in self && length <= 65536) { array = new Uint8Array(length); self.crypto.getRandomValues(array); } else { array = new Array(length); for (let i = 0; i < length; i++) { array[i] = Math.floor(Math.random() * 62); } } let result = ''; for (let i = 0; i < length; i++) { result += possible.charAt(array[i] % 62); } return result; }

yaroslav

이 작고 간단한 트릭은 어떻습니까?

 var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var stringLength = 5; function pickRandom() { return possible[Math.floor(Math.random() * possible.length)]; } var randomString = Array.apply(null, Array(stringLength)).map(pickRandom).join('');

빈 배열을 정의되지 않은 배열로 속이 Array.apply 가 필요합니다.

ES2015용으로 코딩하는 경우 배열을 빌드하는 것이 조금 더 간단합니다.

 var randomString = Array.from({ length: stringLength }, pickRandom).join('');

qubyte

예를 들어 임의의 DNA 시퀀스를 원할 경우 항목 배열을 반복하고 문자열 변수에 재귀적으로 추가할 수 있습니다.

 function randomDNA(len) { len = len || 100 var nuc = new Array("A", "T", "C", "G") var i = 0 var n = 0 s = '' while (i <= len - 1) { n = Math.floor(Math.random() * 4) s += nuc[n] i++ } return s } console.log(randomDNA(5));


Andy

function randomString (strLength, charSet) { var result = []; strLength = strLength || 5; charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; while (--strLength) { result.push(charSet.charAt(Math.floor(Math.random() * charSet.length))); } return result.join(''); }

이것은 얻을만큼 깨끗합니다. 속도도 빠릅니다. http://jsperf.com/ay-random-string .


Gajus

"임의의 문자열이 필요합니다" 질문(언어에 관계없이)에 대한 응답의 문제 는 사실상 모든 솔루션이 string length 의 결함이 있는 기본 사양을 사용한다는 것입니다. 질문 자체는 무작위 문자열이 필요한 이유를 거의 밝히지 않지만 길이가 8과 같은 임의의 문자열이 거의 필요하지 않다는 점에 도전합니다. 예를 들어 어떤 목적을 위한 식별자로 사용하기 위해 항상 필요한 것은 몇 개의 고유 문자열입니다.

엄격하게 고유한 문자열을 얻는 두 가지 주요 방법이 있습니다. 결정적(임의가 아님) 및 저장/비교(부담스러운)입니다. 우리는 무엇을해야합니까? 우리는 유령을 포기합니다. 대신 확률적 고유성을 사용합니다. 즉, 우리는 문자열이 고유하지 않을 약간의 (그러나 작지만) 위험이 있음을 인정합니다. 여기서 충돌 확률엔트로피를 이해하는 것이 도움이 됩니다.

따라서 반복의 위험이 적은 몇 가지 문자열이 필요하다는 불변의 필요성을 다시 설명하겠습니다. 구체적인 예로 500만 개의 ID를 생성할 수 있다고 가정해 보겠습니다. 각각의 새로운 문자열을 저장하고 비교하고 싶지 않고 무작위가 되기를 원하므로 약간의 반복 위험을 감수해야 합니다. 예를 들어, 반복 가능성이 1조 분의 1 미만이라고 가정해 보겠습니다. 그렇다면 어떤 길이의 문자열이 필요합니까? 글쎄, 그 질문은 사용 된 문자에 따라 다르기 때문에 과소 지정되었습니다. 그러나 더 중요한 것은 잘못된 것입니다. 필요한 것은 길이가 아니라 문자열의 엔트로피 사양입니다. 엔트로피는 일부 문자열에서 반복될 확률과 직접 관련될 수 있습니다. 문자열 길이는 할 수 없습니다.

그리고 이것이 EntropyString 과 같은 라이브러리가 도움이 될 수 있는 곳입니다. entropy-string 사용하여 5백만 문자열에서 1조 분의 1 미만의 반복 가능성이 있는 임의의 ID를 생성하려면 다음을 수행하십시오.

 import {Random, Entropy} from 'entropy-string' const random = new Random() const bits = Entropy.bits(5e6, 1e12) const string = random.string(bits)

"44hTNghjNHGGRHqH9"

entropy-string 은 기본적으로 32자의 문자 집합을 사용합니다. 미리 정의된 다른 문자 집합이 있으며 고유한 문자를 지정할 수도 있습니다. 예를 들어, 위와 동일한 엔트로피로 ID를 생성하지만 16진수 문자를 사용하면 다음과 같습니다.

 import {Random, Entropy, charSet16} from './entropy-string' const random = new Random(charSet16) const bits = Entropy.bits(5e6, 1e12) const string = random.string(bits)

"27b33372ade513715481f"

사용된 문자 집합의 총 문자 수의 차이로 인한 문자열 길이의 차이에 유의하십시오. 지정된 수의 잠재적 문자열에서 반복될 위험은 동일합니다. 문자열 길이가 아닙니다. 그리고 무엇보다도 반복의 위험과 잠재적인 문자열 수는 명시적입니다. 더 이상 문자열 길이로 추측할 필요가 없습니다.


dingo sky

대소문자를 구분하지 않는 영숫자:

 function randStr(len) { let s = ''; while (s.length < len) s += Math.random().toString(36).substr(2, len - s.length); return s; } // usage console.log(randStr(50));

이 함수의 이점은 다른 길이의 임의 문자열을 얻을 수 있고 문자열의 길이를 보장한다는 것입니다.

대소문자 구분 모든 문자:

 function randStr(len) { let s = ''; while (len--) s += String.fromCodePoint(Math.floor(Math.random() * (126 - 33) + 33)); return s; } // usage console.log(randStr(50));

맞춤 문자

 function randStr(len, chars='abc123') { let s = ''; while (len--) s += chars[Math.floor(Math.random() * chars.length)]; return s; } // usage console.log(randStr(50)); console.log(randStr(50, 'abc')); console.log(randStr(50, 'aab')); // more a than b


Ali

소문자와 대문자를 모두 지원하는 깨끗한 솔루션을 찾지 못했습니다.

소문자만 지원:

Math.random().toString(36).substr(2, 5)

해당 솔루션을 기반으로 소문자 및 대문자를 지원합니다.

Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');

substr(2, 5) 5 를 변경하여 필요한 길이로 조정하십시오.


ravishi

하나의 라이너 [az]:

 String.fromCharCode(97 + Math.floor(Math.random() * 26))

The Botly Noob

출처 : http:www.stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript

반응형