Generate random string/characters in JavaScript
I think this will work for you:
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));
//Can change 7 to 2 for longer results.let r = (Math.random() + 1).toString(36).substring(7);console.log("random", r);
Note: The above algorithm has the following weaknesses:
- It will generate anywhere between 0 and 6 characters due to the fact that trailing zeros get removed when stringifying floating points.
- It depends deeply on the algorithm used to stringify floating point numbers, which is horrifically complex. (See the paper "How to Print Floating-Point Numbers Accurately".)
Math.random()
may produce predictable ("random-looking" but not really random) output depending on the implementation. The resulting string is not suitable when you need to guarantee uniqueness or unpredictability.- Even if it produced 6 uniformly random, unpredictable characters, you can expect to see a duplicate after generating only about 50,000 strings, due to the birthday paradox. (sqrt(36^6) = 46656)
Math.random is bad for this kind of thing
Option 1
If you're able to do this server-side, just use the crypto module -
var crypto = require("crypto");var id = crypto.randomBytes(20).toString('hex');// "bb5dc8842ca31d4603d6aa11448d1654"
The resulting string will be twice as long as the random bytes you generate; each byte encoded to hex is 2 characters. 20 bytes will be 40 characters of hex.
Option 2
If you have to do this client-side, perhaps try the uuid module -
var uuid = require("uuid");var id = uuid.v4();// "110ec58a-a0f2-4ac4-8393-c866d813b8d1"
Option 3
If you have to do this client-side and you don't have to support old browsers, you can do it without dependencies -
// dec2hex :: Integer -> String// i.e. 0-255 -> '00'-'ff'function dec2hex (dec) { return dec.toString(16).padStart(2, "0")}// generateId :: Integer -> Stringfunction 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"
For more information on crypto.getRandomValues
-
The
crypto.getRandomValues()
method lets you get cryptographically strong random values. The array given as the parameter is filled with random numbers (random in its cryptographic meaning).
Here's a little console example -
> var arr = new Uint8Array(4) # make array of 4 bytes (values 0-255)> arrUint8Array(4) [ 0, 0, 0, 0 ]> window.cryptoCrypto { 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 ]
For IE11 support you can use -
(window.crypto || window.msCrypto).getRandomValues(arr)
For browser coverage see https://caniuse.com/#feat=getrandomvalues