[JavaScript] 使用 Math.random() 產生隨機字串
今天想要幫 App 加一個功能,
讓使用者可以傳回除錯資訊,方便我找問題。
為了避免資料明碼有疑慮,因此打算隨機產生一個加密用的密碼,
傳回資料時,也傳回這個密碼,
確保其他人攔截到資料也沒辦法解密。
要怎麼用 JavaScript 產生一段隨機密碼呢?
比較一般的方法可能是用 Math.random() 在一段像 a~z、0~9、標點符號的陣列裡,
隨機取出字元來,組成一個較長的隨機字串。
不過在上網翻查資料時,意外看到一個頗有趣的隨機字串產生法,
它純粹使用 Math.random() 的輸出,來得到一個隨機字串!
先看一下 Math.random() 的輸出,會是一個 [0, 1) 區間裡的小數:
Math.random() 0.208357281575956
如果將它用 toString() 轉成字串的話,
toString() 裡可以加一個參數代表基底,像是 toString(2) 表示轉成 2 進位:
Math.random().toString(2) "0.11001011010000010000100011001110010010110101000011"
常見的 16 進位:
Math.random().toString(16) "0.4027e187b52d5"
16 進位包含了 0~9 以及 a~f 這些字元,
因此有人提出了使用 36 進位,這樣可以包含 0~9 以及 a~z 這 36 種字元:
Math.random().toString(36) "0.aocty9bpns8"
再試一次,確實產生的字串會不同:
Math.random().toString(36) "0.9psdr9dws1i"
這個方法有幾個缺點,
- 像是如果 Math.random() 傳回 0 的話,產生的字串會變很短如 “0”。
- 因為浮點數有精度問題,因此轉出來的字串長度有其極限,目前看起來就是小數點後 11 位。
不過以目前我的應用來說,這些缺點都還算可以接受,
也算是學到了新的一招囉~
參考資料:Generate random string/characters in JavaScript – Stack Overflow
(本頁面已被瀏覽過 1,300 次)