කට්ටලයෙන් අහඹු ලෙස තෝරාගත් අක්ෂර 5 කින් යුත් අක්ෂර මාලාවක් මට අවශ්යය [a-zA-Z0-9]
.
ජාවාස්ක්රිප්ට් සමඟ මෙය කිරීමට හොඳම ක්රමය කුමක්ද?
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
කට්ටලයෙන් අහඹු ලෙස තෝරාගත් අක්ෂර 5 කින් යුත් අක්ෂර මාලාවක් මට අවශ්යය [a-zA-Z0-9]
.
ජාවාස්ක්රිප්ට් සමඟ මෙය කිරීමට හොඳම ක්රමය කුමක්ද?
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Answers:
මෙය ඔබට ප්රයෝජනවත් වනු ඇතැයි මම සිතමි:
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));
+=
මේ වගේ නූල් භාවිතා කිරීමෙන් එය O (n ^ 2) හැසිරීමට හේතු වේ. ඔබට දිගු නූල් සෑදීමට අවශ්ය නම්, ඔබ තනි අක්ෂර පෙළක් සාදා අවසානයේ ඒවා එකට සම්බන්ධ කළ යුතුය.
+=
කිසියම් හේතුවක් නිසා බොහෝ විට වේගවත් වන අතර, ලූප තුළ පවා භාවිතා වේ - jsperf.com/join-vs-concatenation
let r = Math.random().toString(36).substring(7);
console.log("random", r);
සටහන: ඉහත ඇල්ගොරිතමයට පහත සඳහන් දුර්වලතා ඇත:
Math.random()
ක්රියාත්මක කිරීම මත පදනම්ව පුරෝකථනය කළ හැකි ("අහඹු පෙනුමක්" නමුත් ඇත්ත වශයෙන්ම අහඹු නොවේ) ප්රතිදානය නිපදවිය හැකිය. ඔබට අද්විතීයභාවය හෝ අනපේක්ෂිත බව සහතික කිරීමට අවශ්ය වූ විට ලැබෙන නූල සුදුසු නොවේ.Math.random().toString(36).substr(2, 5)
, .substring(7)
එය අක්ෂර 5 ට වඩා දිගු වීමට හේතු වන බැවිනි . සම්පූර්ණ ලකුණු, තවමත්!
toString
ජාවාස්ක්රිප්ට් හි අංක වර්ගයක ක්රමය ලබා දී ඇති පදනමක් බවට පරිවර්තනය කිරීම සඳහා විකල්ප පරාමිතියක් ගනී. ඔබ දෙකක් සමත් වුවහොත්, උදාහරණයක් ලෙස, ඔබේ අංකය ද්විමය වශයෙන් දැක්වේ. හෙක්ස් (16 වන පාදම) හා සමානව, 36 වන පදනම 9 න් ඔබ්බට ඉලක්කම් නිරූපණය කිරීම සඳහා අකුරු භාවිතා කරයි.
(Math.random() + 1).toString(36).substring(7);
Math.random මේ වගේ දෙයකට නරකයි
විකල්ප 1
ඔබට මෙම සේවාදායකය පැත්තෙන් කළ හැකි නම්, ක්රිප්ටෝ මොඩියුලය භාවිතා කරන්න -
var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');
// "bb5dc8842ca31d4603d6aa11448d1654"
එහි ප්රති string ලයක් ලෙස ඔබ ජනනය කරන අහඹු බයිට් මෙන් දෙගුණයක් දිගු වේ; හෙක්ස් වෙත කේතනය කර ඇති සෑම බයිටයක්ම අක්ෂර 2 කි. බයිට් 20 ක් හෙක්ස් අක්ෂර 40 ක් වනු ඇත.
විකල්ප 2
ඔබට මෙම සේවාදායකයා පැත්තෙන් කළ යුතු නම්, සමහර විට uuid මොඩියුලය උත්සාහ කරන්න -
var uuid = require("uuid");
var id = uuid.v4();
// "110ec58a-a0f2-4ac4-8393-c866d813b8d1"
විකල්ප 3
ඔබට මෙම සේවාදායකයා පැත්තෙන් කළ යුතු අතර ඔබට පැරණි බ්රව්සර් සඳහා සහය දැක්විය යුතු නොවේ නම්, පරායත්තතාවයකින් තොරව ඔබට එය කළ හැකිය -
// dec2hex :: Integer -> String
// i.e. 0-255 -> '00'-'ff'
function dec2hex (dec) {
return dec < 10
? '0' + String(dec)
: dec.toString(16)
}
// 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 බලන්න
.map()
විකල්ප 3 හි අවශ්ය නොවේ . Array.from(arr, dec2hex).join('')
=== Array.from(arr).map(dec2hex).join('')
. මෙම විශේෂාංග සඳහා මාව හඳුන්වා දීම ගැන ස්තූතියි :-)
require
පමණක් භාවිතා සර්වර්-සයිඩ් විය හැකි මොඩියුලය?
මෙහි ඇති ඉහළම ශ්රේණිගත කළ පිළිතුරු වලට සාපේක්ෂව හරියටම අහඹු අක්ෂර 5 ක් ලබා දෙයි.
Math.random().toString(36).substr(2, 5);
Math.random().toString(36)
අක්ෂර 5 ට අඩු සංඛ්යාවක් ආපසු ලබා දෙන්නේ නම් කුමක් කළ යුතුද?
function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
මෙන්න ඩබල් ටැප් හි විශිෂ්ට පිළිතුරේ වැඩි දියුණු කිරීමක් . මුල් පිටපතෙහි අඩුපාඩු දෙකක් ඇත.
පළමුව, අනෙක් අය සඳහන් කර ඇති පරිදි, එයට කෙටි නූල් හෝ හිස් නූලක් නිපදවීමේ කුඩා සම්භාවිතාවක් ඇත (අහඹු අංකය 0 නම්), එමඟින් ඔබේ යෙදුම බිඳ දැමිය හැකිය. මෙන්න විසඳුමක්:
(Math.random().toString(36)+'00000000000000000').slice(2, N+2)
දෙවනුව, මුල් සහ විසඳුම යන දෙකම නූල් ප්රමාණය N අක්ෂර 16 කට සීමා කරයි. පහත දැක්වෙන්නේ ඕනෑම N සඳහා N ප්රමාණයේ නූලක් යවයි (නමුත් N> 16 භාවිතා කිරීමෙන් අහඹු බව වැඩි නොවන අතර isions ට්ටනවල සම්භාවිතාව අඩු නොවන බව සලකන්න):
Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)
පැහැදිලි කිරීම:
වැඩිදුර අදහස්:
යාවත්කාලීන කිරීම:
මෙන්න මම ඉදිරිපත් කළ තවත් ක්රියාකාරී විලාසිතාවේ එක්-ලයිනර් කිහිපයක්. ඉහත විසඳුමට වඩා ඒවා වෙනස් ය:
එබැවින්, ඔබේ තේරීමේ හෝඩිය යැයි කියන්න
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('');
සංස්කරණය කරන්න:
මට පෙනෙන්නේ ක්විබයිට් සහ මාටිජ්න් ඩි මිලියනෝ දෙවැන්න (කුඩෝස්!) හා සමාන විසඳුම් ඉදිරිපත් කළ අතර එය කෙසේ හෝ මග හැරුණි. ඔවුන් බැලූ බැල්මට කෙටියෙන් නොපෙනෙන හෙයින්, යමෙකුට එක ලයිනර් එකක් අවශ්ය නම් මම කෙසේ හෝ මෙහි තබමි :-)
එසේම, තවත් බයිට් කිහිපයක් රැවුල බෑම සඳහා සියලු විසඳුම්වල 'නව අරාව' වෙනුවට 'අරාව' ආදේශ කරන්න.
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
කිරීම අපේක්ෂිත ප්රති result ලයක් ලබා දෙයි.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
වඩාත්ම සංයුක්ත විසඳුම, 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));
Math.random().toString(36).slice(-5);
- Math.random()
ආපසු පැමිණියහොත් 0.0
කුමක් කළ යුතුද?
"0"
;)
Math.random()
නැවත ලබා දෙන්නේ නම් ප්රති 0.5
result ලය වේ "0.i"
. වෙනත් අද්දර අවස්ථා තිබේදැයි විශ්වාස නැත. මෙය ප්රශ්නයට නිවැරදි පිළිතුරක් නොවන බව පෙන්වා දීමට අවශ්ය විය ([a-zA-Z0-9] හි අක්ෂර 5 ක්).
(+new Date + Math.random())
මෙම නඩුව වැළැක්වීම සඳහා මම පෞද්ගලිකව භාවිතා කරමි . කෙසේ වෙතත්, සටහනට ස්තූතියි.
මේ වගේ දෙයක් වැඩ කළ යුතුයි
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');
len
තුළ සෘජුවම while
පුඩුවක්
Es6 පැතිරුම් ක්රියාකරු සමඟ නවතම අනුවාදය :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
අත්තනෝමතික අංකය, ඔබට අවශ්ය ඕනෑම සංකේත දිග ලබා ගත හැක36
ඔබ උරුම විය හැකි උපරිම radix අංකය numeric.toString () , ඉන් අදහස් වන්නේ, සියලු අංක සහ az සිම්පල් අකුරු2
වන 3th දර්ශකය මේ වගේ වන අහඹු string සිට රැගෙන කිරීම සඳහා භාවිතා වේ: "0.mfbiohx64i"
අපි පසු ඕනෑම දර්ශකය ගත විය හැකි0.
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); //A-Z
return String.fromCharCode(n + 61); //a-z
}
while (s.length < L) s += randomchar();
return s;
}
console.log(randomstring(5));
while(s.length< L) s+= randomchar();
while(L--)
එය කරනු ඇත
'A'.charCodeAt(0)
මැජික් අංකයට වඩා ශක්තිමත් ලෙස භාවිතා කිරීම වඩා හොඳය 55
(ඒ හා සමානව 61
). විශේෂයෙන් මගේ වේදිකාවේ කෙසේ වෙතත්, ආපසු එන මැජික් අංකය වේ 65
. එම කේතය ස්වයං ලේඛනය ද වඩා හොඳ වනු ඇත.
/**
* 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)); // i.e: "4Z8iNQag9v"
console.log(randomString(10, "a")); // i.e: "aUkZuHNcWw"
console.log(randomString(10, "n")); // i.e: "9055739230"
ඉහත දැක්වෙන්නේ අපේක්ෂිත දේ සඳහා අතිරේක චෙක්පත් භාවිතා කරන අතර A / N, A, N ප්රතිදානය කරන අතර, වඩා හොඳ අවබෝධයක් සඳහා එය අත්යවශ්ය දෑ (ඇල්ෆා-සංඛ්යාත්මකව පමණි) බිඳ දමමු:
var str = "";
අහඹු අක්ෂර සංයුක්ත කිරීමටrand
0 සිට 61 (0..9 + A..Z + a..z = 62)rand
නිවැරදි CharCode
අංකය සහ අදාළ අක්ෂරය නැවත ලබා ගැනීම සඳහා එය (එය 0..61 බැවින්) එය යම් සංඛ්යාවකින් වැඩි කිරීම (පහත උදාහරණ බලන්න) .str
aString.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
(අපට අවශ්ය දේ) සිට පරාසයක් ලබා දෙයි .
නිවැරදි වර්ග කේත පරාසයන් ලබා ගැනීම සඳහා අහඹු ලෙස සකස් කරමු :
| 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 ;
ඉහත පැහැදිලි කිරීමෙන්, මෙහි ප්රති ing ලයක් ලෙස ඇල්ෆා සංඛ්යාත්මක ස්නිපටය :
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)); // i.e: "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))
සරලම ක්රමය නම්:
(new Date%9e6).toString(36)
මෙය වත්මන් කාලය මත පදනම්ව අක්ෂර 5 ක අහඹු නූල් ජනනය කරයි. නිදර්ශන ප්රතිදානය 4mtxj
හෝ 4mv90
හෝ4mwp1
මෙහි ඇති ගැටළුව නම්, ඔබ එය එකම තත්පරයකට දෙවරක් අමතන්නේ නම්, එය එකම නූලක් ජනනය කරනු ඇත.
ආරක්ෂිත ක්රමය නම්:
(0|Math.random()*9e6).toString(36)
මෙය අහඹු ලෙස අක්ෂර 4 ක් හෝ 5 ක් උත්පාදනය කරනු ඇත, සෑම විටම වෙනස් වේ. නිදර්ශන ප්රතිදානය සමාන 30jzm
හෝ 1r591
හෝ4su1a
දෙයාකාරයෙන්ම පළමු කොටස අහඹු සංඛ්යාවක් ජනනය කරයි. මෙම .toString(36)
කොටස එය ක base36 (alphadecimal) නියෝජන කිරීමට සංඛ්යාව දමති.
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
ආවරණය කිරීම සඳහා එය ප්රතිස්ථාපනය කළ හැකිය .
(Math.random()*1e20).toString(36)
.
මෙන්න පහසු එක් ලයිනර් කිහිපයක්. වෙනස් කරන්න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"]();});
සෑම කෙනෙකුම දැනටමත් එය නිවැරදිව ලබාගෙන ඇති බව මම දනිමි, නමුත් මට හැඟී ගියේ හැකි තරම් සැහැල්ලු ආකාරයකින් මෙය කළ හැකි බවයි (කේතයේ ආලෝකය, 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));
ඔබේ හිස එතීමට මඳ වේලාවක් ගත වේ, නමුත් මම සිතන්නේ එය සැබවින්ම ජාවාස්ක්රිප්ට් හි වාක්ය ඛණ්ඩය කෙතරම් විශිෂ්ටද යන්න පෙන්නුම් කරයි.
current = current ? current : '';
විට ලියන්න current = current || ''
.
current || (current = '');
ඔබ භාවිතා කරන්නේ නම් Lodash හෝ Underscore , එය ඉතා සරළ:
var randomVal = _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 5).join('');
_.sampleSize('asdfgh',5).join('')
අවශ්යතාවය සපුරාලීම සඳහා [a-zA-Z0-9] සහ දිග = 5 භාවිතය
btoa(Math.random()).substr(5, 5);
කුඩා අකුරු, ලොකු අකුරු සහ අංක සිදුවනු ඇත.
මතකය එකවර වෙන් කරන එක් ලයිනර් එකක් (ඔබේ පහසුව සඳහා ආකෘතිකරණය කර නොතිබුණද) යමෙකු උනන්දු වන්නේ නම් (නමුත් කුඩා නූල් සඳහා එය ඇත්ත වශයෙන්ම වැදගත් නොවන බව සලකන්න) මෙහි එය කරන්නේ කෙසේද:
Array.apply(0, Array(5)).map(function() {
return (function(charset){
return charset.charAt(Math.floor(Math.random() * charset.length))
}('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'));
}).join('')
ඔබට අවශ්ය නූලෙහි 5
දිග අනුව ප්රතිස්ථාපනය කළ හැකිය . විසින් නිර්මාණය කරන ලද විරල අරාව මත ක්රියා නොකිරීමේ ශ්රිතයට විසඳුම ලබා දීම සඳහා මෙම ලිපියේ riAriyaHidayat ට ස්තූතියි .map
Array(5)
මෙන්න මම නිර්මාණය කළ ක්රමය.
එය ලොකු අකුරු සහ කුඩා අකුරු අඩංගු නූලක් නිර්මාණය කරයි.
ඊට අමතරව මම අක්ෂරාංක නූලක් නිර්මාණය කරන ශ්රිතයද ඇතුළත් කර ඇත්තෙමි.
වැඩ කරන උදාහරණ:
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
මෙය එකම දේ කරන නමුත් වඩා අර්ථවත් වන අතර සියලු අක්ෂර ඇතුළත් වේ.
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)));
}
ඔබ යටි ඉරි ලකුණු භාවිතා කරයි යැයි උපකල්පනය කිරීමෙන් පේළි දෙකකින් අහඹු ලෙස නූල් උත්පාදනය කළ හැකිය:
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var random = _.sample(possible, 5).join('');
const c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
const s = [...Array(5)].map(_ => c[~~(Math.random()*c.length)]).join('')
~~
උපක්රමය ගැන දැන සිටියේ නැත ! හොඳයි!
වේගවත් හා වැඩිදියුණු කළ ඇල්ගොරිතම. නිල ඇඳුම සහතික නොකරයි (අදහස් බලන්න).
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;
}
crypto.getRandomValues
අද්විතීය අගයන් 256 න් එකක් ලබා දෙයි. 256 62 න් බෙදී නැති නිසා, ඔබ අවසන් වන්නේ AH අක්ෂර ලබා ගැනීමේ තරමක් ඉහළ සම්භාවිතාවක් ඇතිවය. මම හිතන්නේ හොඳම විසඳුම වන්නේ යූ ටියුබ් කළ දේ කිරීමයි, තවද අක්ෂර 2 ට (සමහර විට -
සහ _
) අක්ෂර කට්ටලයට එක් කරන්න. කෙසේ වෙතත්, නියම වැඩක් - මෙම පිළිතුරට තවත් බොහෝ ආදරය අවශ්යයි :)
එක් ලයිනර්:
Array(15).fill(null).map(() => Math.random().toString(36).substr(2)).join('')
// Outputs: 0h61cbpw96y83qtnunwme5lxk1i70a6o5r5lckfcyh1dl9fffydcfxddd69ada9tu9jvqdx864xj1ul3wtfztmh2oz2vs3mv6ej0fe58ho1cftkjcuyl2lfkmxlwua83ibotxqc4guyuvrvtf60naob26t6swzpil
Array(15)
අගයකට කුඩා අගයකට වෙනස් කිරීම. උදා: Array(4)
.
"මට අහඹු නූල් අවශ්යයි" ප්රශ්න වලට ප්රතිචාර දැක්වීමේ ගැටළුව (ඕනෑම භාෂාවකින්) ප්රායෝගිකව සෑම විසඳුමක්ම නූල් දිගෙහි දෝෂ සහිත ප්රාථමික පිරිවිතරයක් භාවිතා කරයි . අහඹු නූල් අවශ්ය වන්නේ මන්දැයි ප්රශ්න විසින්ම හෙළි කරන්නේ කලාතුරකිනි, නමුත් මම ඔබට අභියෝග කරන්නේ කලාතුරකින් අහඹු ලෙස දිග අවශ්ය වන බව පවසන්න. 8 ඔබට නොකඩවා අවශ්ය වන්නේ අද්විතීය නූල් කිහිපයක් , උදාහරණයක් ලෙස, සමහර සඳහා හඳුන්වන ලෙස භාවිතා කිරීමට.
තදින් අද්විතීය නූල් ලබා ගැනීම සඳහා ප්රමුඛ ක්රම දෙකක් තිබේ : නිර්ණායක වශයෙන් (එය අහඹු නොවේ) සහ ගබඩා කිරීම / සංසන්දනය කිරීම (එය බරයි). අපි මොකද කරන්නේ? අපි අවතාරය අත්හරින්නෙමු. අපි ඒ වෙනුවට සම්භාවිතා සුවිශේෂත්වය සමඟ යමු . එනම්, අපගේ නූල් අද්විතීය නොවන බවට යම් (කෙසේ වෙතත් කුඩා) අවදානමක් ඇති බව අපි පිළිගනිමු. Ision ට්ටන සම්භාවිතාව සහ එන්ට්රොපිය අවබෝධ කර ගැනීම මෙහිදීය ප්රයෝජනවත් .
එබැවින් නැවත නැවත කිරීමේ කුඩා අවදානමක් ඇති නූල් කිහිපයක් අවශ්ය බැවින් වෙනස් කළ නොහැකි අවශ්යතාව මම නැවත ලියමි. සංයුක්ත උදාහරණයක් ලෙස, ඔබට හැඳුනුම්පත් මිලියන 5 ක විභවයක් ජනනය කිරීමට අවශ්ය යැයි කියමු. සෑම නව නූලක්ම ගබඩා කර සංසන්දනය කිරීමට ඔබට අවශ්ය නැති අතර ඒවා අහඹු ලෙස වීමට ඔබට අවශ්යය, එබැවින් ඔබ නැවත නැවත වීමේ අවදානමක් පිළිගනී. උදාහරණයක් ලෙස, නැවත කියවීමේ අවස්ථාව ට්රිලියන 1 ට 1 ට වඩා අඩු අවදානමක් යැයි කියමු. ඉතින් ඔබට අවශ්ය නූල් දිග කුමක්ද? හොඳයි, එම ප්රශ්නය අවතක්සේරු කර ඇත්තේ එය භාවිතා කරන අක්ෂර මත රඳා පවතින බැවිනි. නමුත් වඩා වැදගත් දෙය නම් එය නොමඟ යවන සුළුය. ඔබට අවශ්ය වන්නේ නූල් වල එන්ට්රොපියෙහි පිරිවිතරයක් මිස ඒවායේ දිග නොවේ. එන්ට්රොපිය කෙඳි ගණනාවක පුනරාවර්තනයේ සම්භාවිතාව සමඟ කෙලින්ම සම්බන්ධ විය හැකිය. නූල් දිගට බැහැ.
එන්ට්රොපි ස්ට්රිං වැනි පුස්තකාලයකට උදව් කළ හැකි ස්ථානය මෙයයි. ට්රිලියන 1 ට වඩා අඩු අහඹු හැඳුනුම්පත් උත්පාදනය කිරීම සඳහා නූල් මිලියන 5 කින් පුනරාවර්තනය වීමට entropy-string
:
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 ක් සහිත අක්ෂර කට්ටලයක් භාවිතා කරයි. වෙනත් පූර්ව නිශ්චිත අක්ෂර කට්ටල ඇත, ඔබට ඔබේම අක්ෂරද නියම කළ හැකිය. උදාහරණයක් ලෙස, ඉහත ආකාරයටම එන්ට්රොපිය සමඟ හැඳුනුම්පත් උත්පාදනය කිරීම, නමුත් හෙක්ස් අක්ෂර භාවිතා කිරීම:
import {Random, Entropy, charSet16} from './entropy-string'
const random = new Random(charSet16)
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"27b33372ade513715481f"
භාවිතා කරන ලද අක්ෂර කට්ටලයේ මුළු අක්ෂර ගණනෙහි වෙනස හේතුවෙන් නූල් දිගෙහි වෙනස සැලකිල්ලට ගන්න. නිශ්චිත විභව නූල් ගණන පුනරාවර්තනය වීමේ අවදානම සමාන වේ. නූල් දිග නොවේ. සියල්ලටම වඩා, පුනරාවර්තනයේ අවදානම සහ විභව නූල් ගණන පැහැදිලිය. නූල් දිග සමඟ තවත් අනුමාන කිරීමක් නැත.
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 .
strLength - 1
: - /
--strLength
කිරීමට මාරු වීම strLength--
.
ඔබට අයිතම රාශියක් හරහා ලූප් කර ඒවා විචල්ය විචල්යයකට පුනරාවර්තනය කළ හැකිය, උදාහරණයක් ලෙස ඔබට අහඹු ඩීඑන්ඒ අනුක්රමයක් අවශ්ය නම්:
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));
මේ වගේ දෙයක් ගැන කොහොමද: Date.now().toString(36)
අහඹු ලෙස නොවේ, නමුත් ඔබ එය අමතන සෑම අවස්ථාවකම කෙටි හා සුවිශේෂී වේ.
Date.now()
මිලි තත්පර විභේදන පමණක් ඇත. සරල පුඩුවක් තුළ ධාවනය වන විට, උදාහරණයක් ලෙස, ඔබට අනුපිටපත් රාශියක් ලැබෙනු ඇත. for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
.
කුඩා අකුරු සහ ලොකු අකුරු සඳහා සහය දැක්වීම සඳහා පිරිසිදු විසඳුමක් මට හමු නොවීය.
සිම්පල් පමණක් සහාය:
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('');
ඔබට අවශ්ය දිගට හැඩගැසීමට 5
in වෙනස් කරන්න substr(2, 5)
.
මෙය නිසැකවම ක්රියා කරයි
<script language="javascript" type="text/javascript">
function randomString() {
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
var string_length = 8;
var randomstring = '';
for (var i=0; i<string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
}
document.randform.randomfield.value = randomstring;
}
</script>
මෙම සංයුක්ත කුඩා උපක්රමය ගැන කුමක් කිව හැකිද?
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('');
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
var possible
පිළිගත් පිළිතුරට සමාන දෙයක් එකතු කළ හැකි නම් එය සිසිල් වනු ඇත , එබැවින් ශ්රිතයේ ප්රති come ල වඩාත් වින්යාසගත කළ හැකිය.
මෙන්න මගේ ප්රවේශය (ටයිප්ස්ක්රිප්ට් සමඟ).
නවීන js සහ පිරිසිදු කේත භාවිතා කරමින් සරල විසඳුමක් මා නොදකින නිසා තවත් ප්රතිචාරයක් ලිවීමට මම තීරණය කර ඇත්තෙමි.
const DEFAULT_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
function getRandomCharFromAlphabet(alphabet: string): string {
return alphabet.charAt(Math.floor(Math.random() * alphabet.length));
}
function generateId(idDesiredLength: number, alphabet = DEFAULT_ALPHABET): string {
/**
* Create n-long array and map it to random chars from given alphabet.
* Then join individual chars as string
*/
return Array.from({length: idDesiredLength}).map(() => {
return getRandomCharFromAlphabet(alphabet);
}).join('');
}
generateId(5); // jNVv7
true-random
result ලයක් නැත! ඒවා පමණිpseudo-random
. ආරක්ෂාව හෝ ආරක්ෂාව සඳහා අහඹු නූල් භාවිතා කරන විට, ඒවා කිසිවක් භාවිතා නොකරන්න !!! මෙම api වලින් එකක් උත්සාහ කරන්න: random.org