[JavaScript] 使用 Math.random() 產生隨機字串

[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"

 

這個方法有幾個缺點,

  1. 像是如果 Math.random() 傳回 0 的話,產生的字串會變很短如 “0”。
  2. 因為浮點數有精度問題,因此轉出來的字串長度有其極限,目前看起來就是小數點後 11 位。

 

不過以目前我的應用來說,這些缺點都還算可以接受,

也算是學到了新的一招囉~

 

參考資料:Generate random string/characters in JavaScript – Stack Overflow

(本頁面已被瀏覽過 88 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料