আমি সেট থেকে এলোমেলোভাবে বাছাই করা অক্ষরের সমন্বয়ে গঠিত 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);
উত্তর:
আমি মনে করি এটি আপনার পক্ষে কাজ করবে:
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) আচরণ করে behavior আপনি যদি দীর্ঘতর স্ট্রিং তৈরি করতে চান, আপনার পৃথক অক্ষরের একটি অ্যারে তৈরি করা উচিত এবং শেষে তাদের একসাথে যোগদান করা উচিত।
+=
প্রায়শই কোনও কারণে দ্রুত হয়, এমনকি লুপগুলির অভ্যন্তরে ব্যবহৃত হয় - jsperf.com/join-vs- সংবিধান
crypto
পরিবর্তে ব্যবহার করুন।
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
জাভাস্ক্রিপ্টে একটি সংখ্যা টাইপের পদ্ধতিতে নম্বরটিকে একটি বেসকে রূপান্তর করতে একটি optionচ্ছিক প্যারামিটার লাগে। উদাহরণস্বরূপ, আপনি যদি দুটি পাস করেন তবে আপনি বাইনারিটিতে আপনার সংখ্যা উপস্থাপন করবেন। হেক্স (বেস 16) এর অনুরূপ, বেস 36 অক্ষরের প্রতিনিধিত্ব করতে 9 টিরও বেশি সংখ্যা উপস্থাপন করতে অক্ষর ব্যবহার করে একটি এলোমেলো সংখ্যাটিকে বেস 36 এ রূপান্তর করে, আপনি আপাতদৃষ্টিতে এলোমেলো অক্ষর এবং সংখ্যার একগুচ্ছ দিয়ে সজ্জিত হবেন।
(Math.random() + 1).toString(36).substring(7);
ম্যাথ.র্যান্ডম এই ধরণের জিনিসটির জন্য খারাপ
বিকল্প 1
আপনি যদি এই সার্ভারের পাশাপাশি করতে সক্ষম হন তবে কেবল ক্রিপ্টো মডিউলটি ব্যবহার করুন -
var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');
// "bb5dc8842ca31d4603d6aa11448d1654"
ফলস্বরূপ স্ট্রিংটি আপনার এলোমেলো বাইটগুলি দ্বিগুণ হবে; হেক্সে এনকোড করা প্রতিটি বাইট 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 ('0' + dec.toString(16)).substr(-2)
}
// 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 ]
আইই 11 সমর্থনের জন্য আপনি ব্যবহার করতে পারেন -
(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; };
এখানে একটি উন্নতি এর doubletap এর চমৎকার উত্তর । মূলটির দুটি ঘাটতি রয়েছে যা এখানে সম্বোধন করা হয়েছে:
প্রথমত, অন্যরা যেমন উল্লেখ করেছে, এতে ছোট স্ট্রিং তৈরির এমনকি একটি খালি স্ট্রিং তৈরির সম্ভাবনা রয়েছে (যদি এলোমেলো সংখ্যাটি 0 হয়) যা আপনার অ্যাপ্লিকেশনটি ভেঙে দিতে পারে। এখানে একটি সমাধান:
(Math.random().toString(36)+'00000000000000000').slice(2, N+2)
দ্বিতীয়ত, উপরের মূল এবং সমাধান উভয়ই স্ট্রিংয়ের আকার N এর মধ্যে 16 টি অক্ষর সীমাবদ্ধ করে। নিম্নলিখিত যে কোনও এন এর আকার N এর স্ট্রিং ফিরিয়ে দেবে (তবে নোট করুন যে এন> 16 ব্যবহার করে এলোমেলোতা বাড়বে না বা সংঘর্ষের সম্ভাবনা হ্রাস পাবে না):
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)
একটি প্রত্যাশিত ফলাফল দেয় যা আরও বেশি পছন্দ করে.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
করলে ফলাফল হয় "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
লুপে হ্রাস পেতে পারে
এস 6 স্প্রেড অপারেটর সহ একটি নতুন সংস্করণ :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
অবাধ নম্বর, যদি আপনি কোন টোকেন দৈর্ঘ্য যদি আপনি চান বাছাই করতে পারেন36
সর্বাধিক র্যাডিক্স সংখ্যা আপনাকে প্রেরণ করতে পারেন numeric.toString () , যার মানে সব সংখ্যা এবং AZ ছোট হাতের অক্ষর2
র্যান্ডম স্ট্রিং ভালো দেখায় যা থেকে 3 বিন্দু সূচক বাছাই ব্যবহার করা হয়: "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
সূচক নম্বর তৈরি করুনrand
CharCode
str
কString.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 ;
উপরের ব্যাখ্যা থেকে, ফলাফলের আলফা-সংখ্যার স্নিপেট এখানে :
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"]();});
আমি জানি যে সবাই ইতিমধ্যে এটি পেয়েছে, তবে আমার মনে হয়েছে যে এটি সম্ভব সবচেয়ে হালকা উপায়ে (কোডে হালকা, সিপিইউ নয়) এই দিকে একবার যেতে পারে:
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 বা আন্ডারস্কোর , তাহলে এটি এত সহজ:
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
যে স্ট্রিং চান তার দৈর্ঘ্য দ্বারা প্রতিস্থাপন করতে পারেন। এই পোস্টে @ আরিয়াহাইদয়াতকে ধন্যবাদ জানায় যে map
দ্বারা তৈরি স্পার্স অ্যারেটিতে কাজ না করে সমাধানের সমাধানের জন্য Array(5)
।
আমার তৈরি পদ্ধতিটি এখানে Here
এটি একটি স্ট্রিং তৈরি করবে যা বড় এবং ছোট উভয় অক্ষর সমন্বিত থাকবে।
এছাড়াও আমি ফাংশনটি অন্তর্ভুক্ত করেছি যা একটি বর্ণমালার স্ট্রিংও তৈরি করবে।
কার্যকারী উদাহরণ:
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;
}
জুলাই ২০১৫ আপগ্রেড করুন
এটি একই কাজ করে তবে আরও বুদ্ধিমান হয় এবং এতে সমস্ত অক্ষর অন্তর্ভুক্ত থাকে।
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 দ্বারা বিভক্ত নয়, আপনার অক্ষর এএইচ হওয়ার কিছুটা বেশি সম্ভাবনা রয়েছে। আমি মনে করি ইউটিউব যা করেছে তা করাই সর্বোত্তম সমাধান এবং চরসেটটিতে কেবলমাত্র 2 টি অতিরিক্ত অক্ষর (সম্ভবত -
এবং _
) যুক্ত করা। যাইহোক, দুর্দান্ত কাজ - এই উত্তরের আরও বেশি ভালবাসার দরকার আছে :)
"আমার এলোমেলো স্ট্রিং দরকার" প্রশ্নের (যে কোনও ভাষায়) প্রশ্নের প্রতিক্রিয়াগুলির সাথে সমস্যাটি কার্যত প্রতিটি সমাধান স্ট্রিং দৈর্ঘ্যের ত্রুটিযুক্ত প্রাথমিক স্পেসিফিকেশন ব্যবহার করে । প্রশ্নগুলি এলোমেলোভাবে স্ট্রিংগুলির প্রয়োজনীয়তার জন্য খুব কমই প্রকাশ করে তবে আমি আপনাকে চ্যালেঞ্জ জানাবো যে খুব কমই আপনার দৈর্ঘ্যের এলোমেলো স্ট্রিং দরকার, ৮. আপনার যা প্রয়োজন সবসময়ই অনন্য স্ট্রিংগুলির একটি সংখ্যা need , উদাহরণস্বরূপ, কোনও উদ্দেশ্যে সনাক্তকারী হিসাবে ব্যবহার করা।
কঠোরভাবে অনন্য স্ট্রিংগুলি পাওয়ার জন্য দুটি প্রধান উপায় রয়েছে : ডিটারনিস্টিকালি (যা এলোমেলো নয়) এবং স্টোর / তুলনা (যা অত্যধিক)। আমরা কি করি? আমরা ভূত ছেড়ে দিই। পরিবর্তে আমরা সম্ভাব্য স্বতন্ত্রতার সাথে যাই । এটি হ'ল আমরা স্বীকার করি যে কিছু কিছু (তবে ছোট) ঝুঁকি রয়েছে যে আমাদের স্ট্রিংগুলি অনন্য হবে না। এখানেই সংঘর্ষের সম্ভাবনা এবং এনট্রপি বোঝা যাচ্ছে সহায়ক।
সুতরাং আমি পুনরায় অল্প অল্প ঝুঁকির সাথে কয়েকটি সংখ্যক স্ট্রিংয়ের প্রয়োজন হিসাবে অদৃশ্য প্রয়োজনটিকে পুনরায় বলব। একটি দৃ concrete় উদাহরণ হিসাবে, আসুন আমরা 5 মিলিয়ন আইডি তৈরির সম্ভাবনা তৈরি করতে চাই say আপনি প্রতিটি নতুন স্ট্রিং সংরক্ষণ এবং তুলনা করতে চান না এবং আপনি এগুলি এলোমেলো হতে চান, তাই আপনি পুনরাবৃত্তি হওয়ার কিছুটা ঝুঁকি গ্রহণ করেন। উদাহরণস্বরূপ, আসুন পুনরাবৃত্তি হওয়ার ট্রিলিয়ন সম্ভাবনায় 1 এরও কম ঝুঁকি বলি। সুতরাং আপনার স্ট্রিংয়ের কত দৈর্ঘ্যের প্রয়োজন? ঠিক আছে, প্রশ্নটি অল্প সংজ্ঞাযুক্ত কারণ এটি ব্যবহৃত চরিত্রগুলির উপর নির্ভর করে। তবে আরও বড় কথা, এটি বিপথগামী। আপনার যা প্রয়োজন তা হল স্ট্রিংগুলির এনট্রপির একটি স্পেসিফিকেশন, তাদের দৈর্ঘ্য নয়। এন্ট্রপিটি কয়েকটি স্ট্রিংয়ের পুনরাবৃত্তির সম্ভাবনার সাথে সরাসরি সম্পর্কিত হতে পারে। স্ট্রিং দৈর্ঘ্য পারে না।
এবং এটি এন্ট্রপিস্ট্রিংয়ের মতো লাইব্রেরি সাহায্য করতে পারে। ৫ মিলিয়ন স্ট্রিং ব্যবহার করে ট্রিলিয়ন পুনরাবৃত্তি হওয়ার সম্ভাবনাতে ১ টিরও কম র্যান্ডম আইডি তৈরি করতে 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 টি অক্ষর সহ একটি অক্ষর সেট ব্যবহার করে uses অন্যান্য পূর্বনির্ধারিত অক্ষর সেট রয়েছে এবং আপনি নিজের অক্ষরও নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, উপরের মতো একই এনট্রপি সহ আইডি উত্পন্ন করা কিন্তু হেক্স অক্ষর ব্যবহার করে:
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));
ছোট হাতের এবং বড় হাতের অক্ষর উভয়কেই সমর্থন করার জন্য আমি একটি পরিষ্কার সমাধান পাইনি।
লোয়ারকেস শুধুমাত্র সমর্থন:
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
ইন পরিবর্তন করুন substr(2, 5)
।
এক রৈখিক:
Array(15).fill(null).map(() => Math.random().toString(36).substr(2)).join('')
// Outputs: 0h61cbpw96y83qtnunwme5lxk1i70a6o5r5lckfcyh1dl9fffydcfxddd69ada9tu9jvqdx864xj1ul3wtfztmh2oz2vs3mv6ej0fe58ho1cftkjcuyl2lfkmxlwua83ibotxqc4guyuvrvtf60naob26t6swzpil
Array(15)
একটি ছোট মান হিসাবে যুক্তি সংক্ষিপ্ত পরিবর্তন করতে । উদাহরণ: Array(4)
।
এটি নিশ্চিতভাবে কাজ করে
<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>
এই জাতীয় কিছুর সম্পর্কে: Date.now().toString(36)
খুব এলোমেলো নয়, তবে প্রতিবার আপনি যখন কল করবেন তখন ছোট এবং বেশ অনন্য।
Date.now()
কেবল মিলিসেকেন্ড রেজোলিউশন রয়েছে। একটি সাধারণ লুপে চালানোর সময়, উদাহরণস্বরূপ, আপনি প্রচুর নকল পাবেন। for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
।
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
স্বীকৃত উত্তরের মতো একটি যোগ করতে পারেন তবে এটি দুর্দান্ত হবে , সুতরাং ফাংশনের ফলাফলটি আরও কনফিগারযোগ্য।
10 অক্ষর দীর্ঘ স্ট্রিং উত্পন্ন। দৈর্ঘ্য পরামিতি দ্বারা সেট করা হয় (ডিফল্ট 10)।
function random_string_generator(len) {
var len = len || 10;
var str = '';
var i = 0;
for(i=0; i<len; i++) {
switch(Math.floor(Math.random()*3+1)) {
case 1: // digit
str += (Math.floor(Math.random()*9)).toString();
break;
case 2: // small letter
str += String.fromCharCode(Math.floor(Math.random()*26) + 97); //'a'.charCodeAt(0));
break;
case 3: // big letter
str += String.fromCharCode(Math.floor(Math.random()*26) + 65); //'A'.charCodeAt(0));
break;
default:
break;
}
}
return str;
}
আপনি কোডেরেন ব্যবহার করতে পারেন । এটি প্রদত্ত প্যাটার্ন অনুসারে এলোমেলো কোড উত্পন্ন করার জন্য একটি গ্রন্থাগার। #
উপরের এবং ছোট হাতের অক্ষরের পাশাপাশি অঙ্কগুলির জন্য স্থানধারক হিসাবে ব্যবহার করুন :
var cr = new CodeRain("#####");
console.log(cr.next());
অন্য স্থানধারক যেমন A
বড় হাতের অক্ষর বা 9
অঙ্কগুলির জন্য রয়েছে।
দরকারী হতে পারে যে কলিং হয় .next()
সর্বদা আপনাকে একটি অনন্য ফলাফল দেয় যাতে আপনাকে নকল সম্পর্কে চিন্তা করতে হবে না।
এখানে একটি ডেমো অ্যাপ্লিকেশন যা অনন্য এলোমেলো কোডগুলির একটি তালিকা তৈরি করে ।
সম্পূর্ণ প্রকাশ: আমি কোডরেইনের লেখক।
true-random
ফলাফলই নেই! তারা কেবলpseudo-random
। সুরক্ষা বা সুরক্ষার জন্য এলোমেলো স্ট্রিং ব্যবহার করার সময়, এগুলির কোনও ব্যবহার করবেন না !!! এপিআইয়ের একটিটির