周五,快下班了,正收拾東西准備走人,項目經理突然讓我給他做個Excel,1000個數字加字母組合的密碼,不重復,下班前給。
我直接懵了,Excel不會,估計是要寫個什么命令才能生成出來,於是想着有沒有什么軟件可以生成,找了一會兒還是放棄了。等着下班回家呢,自己來吧。
廢話少說,上代碼。
<div id="keys"></div> <script> // 生成十位字母加數字隨機數 var arr = []; for (var i=0;i<1000;i++) { var n = Math.random().toString(36).substr(2,10); arr.push(n); } // 去重 var ukeys = []; for (var i = 0; i < arr.length; i++) { if (ukeys.indexOf(arr[i]) == -1) { console.log(arr[i]) ukeys.push(arr[i]); } } // 數組處理,便於在Html文檔中顯示 var keys = ''; for (var i=0;i<ukeys.length;i++) { ukeys[i] += '<br>' keys += ukeys[i] } $('#keys').html(keys); console.log('去重后的密碼個數:' + ukeys.length); </script>
Math.random() 輸出0到1(包括0,不包含1)的隨機數。
toString(16) 將隨機數轉換為16進制的字符串。
substring(2, 10) 截取字符串,因為隨機數大於等於0小於1,前兩位是 " 0. " , substring(2, 10)從第三位開始截取十位。
去重。檢查數組中的每一個元素,如果當前元素在新的數組中已經存在則忽略,否則加入倒新數組中。最后得到的新數組就是所要的不重復的密碼。
至此已經得到了1000個數字加字母組合的密碼,而且不重復,但是由於要拷貝到excel中,如果直接在控制台中打印然后復制,結果是這樣的:
randomCode.html:23 ud6202zt55
randomCode.html:23 oqu89g76tu
randomCode.html:23 m5cibg4jv1
因此需要對結果進行格式化以方便復制,如下:
即在每一項元素后面添加一個換行標簽<br>, 然后在頁面中顯示出來,效果如下:
然后全選粘貼到Excel就ok啦。
小結:生成密鑰數組主要用到了JS的 Math.random() 、toString(36)、substr(start, n)方法,關鍵在於數值轉換成16進制字符串的過程。
數組去重主要用到了 indexOf() 方法。數組去重是個十分經典的問題,方法很多,個人認為使用indexOf()逐項排除是最簡單的,其他的方法有時間也需要研究一下。
整個過程的代碼還是十分簡單和基礎的,照這樣的方法,只要系統承受得了,生成十萬個一百萬個數十位不重復的密鑰也是沒有任何問題的。