Ich möchte eine 5-Zeichen-Zeichenfolge, die aus zufällig ausgewählten Zeichen aus der Menge [a-zA-Z0-9]
.
Wie lässt sich dies am besten mit JavaScript bewerkstelligen?
Ich möchte eine 5-Zeichen-Zeichenfolge, die aus zufällig ausgewählten Zeichen aus der Menge [a-zA-Z0-9]
.
Wie lässt sich dies am besten mit JavaScript bewerkstelligen?
Ich denke, das wird für Sie funktionieren:
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));
@dan_waterworth Es spielt wahrscheinlich keine Rolle in fast jede Fall: codinghorror.com/blog/2009/01/
Es mag falsch aussehen, aber floor
wird nicht benötigt: for(var text=''; text.length < 5;) text += possible.charAt(Math.random() * possible.length)
@dan_waterworth, Eigentlich, +=
ist aus irgendeinem Grund oft schneller, auch innerhalb von Schleifen - jsperf.com/beitreten-vs-verkettung
Math.random ist schlecht für diese Art von Dingen
Option 1
Wenn Sie in der Lage sind, dies zu tun Server -Seite, verwenden Sie einfach die Krypto Modul -
var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');
// "bb5dc8842ca31d4603d6aa11448d1654"
Die resultierende Zeichenkette ist doppelt so lang wie die zufällig erzeugten Bytes; jedes in Hexadezimal kodierte Byte besteht aus 2 Zeichen. 20 Bytes sind also 40 Zeichen in Hexadezimalzeichen.
Option 2
Wenn Sie dies tun müssen Kunde -Seite, vielleicht versuchen Sie das uuid-Modul -
var uuid = require("uuid");
var id = uuid.v4();
// "110ec58a-a0f2-4ac4-8393-c866d813b8d1"
Option 3
Wenn Sie dies tun müssen Kunde -Seite und Sie müssen keine alten Browser unterstützen, Sie können es ohne Abhängigkeiten tun -
// dec2hex :: Integer -> String
// i.e. 0-255 -> '00'-'ff'
function dec2hex (dec) {
return dec.toString(16).padStart(2, "0")
}
// 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"
Für weitere Informationen über crypto.getRandomValues
-
El
crypto.getRandomValues()
Methode können Sie kryptografisch starke Zufallswerte erhalten. Das als Parameter angegebene Array wird mit Zufallszahlen gefüllt (zufällig in seiner kryptographischen Bedeutung).
Hier ein kleines Konsolenbeispiel -
> 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 ]
Für IE11-Unterstützung können Sie -
(window.crypto || window.msCrypto).getRandomValues(arr)
Für Browserabdeckung siehe https://caniuse.com/#feat=getrandomvalues
Beachten Sie, dass bei UUIDs der Version 4 nicht alle Zeichen zufällig sind. Aus Wikipedia: "UUIDs der Version 4 haben die Form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, wobei x eine beliebige Hexadezimalziffer und y eine der Zahlen 8, 9, A oder B ist". ( de.wikipedia.org/wiki/ )
@wmassingham, ich bin mir nicht sicher, ob ich den Zweck Ihres Kommentars verstehe. Wollen Sie damit etwas über die Einzigartigkeit aufgrund einiger fester Zeichen in einer v4 uuid andeuten?
Ganz genau. Während eine UUID gut geeignet ist, um einer Sache eine ID zuzuweisen, ist die Verwendung als Zeichenkette aus zufälligen Zeichen aus diesem (und wahrscheinlich anderen) Gründen keine gute Idee.
Was wäre, wenn Math.random().toString(36)
eine Zahl mit weniger als 5 Zeichen zurückgibt?
SilverRingvee hat wahrscheinlich nur kopiert der Kommentar von @dragon in der zweiten Antwort. Ehre, wem Ehre gebührt.
Nun, das ist eine interessante Anschuldigung von @Aperçu. Ich behaupte nicht, dass ich die Lösung erfunden habe, aber ich verwende sie schon seit Jahren in meinen Projekten. Und es hat nichts mit dem von Ihnen erwähnten Kommentar zu tun. Und ich bin mir ziemlich sicher, dass es in SO darauf ankommt, die nützlichsten Informationen an der richtigen Stelle zu finden, auch wenn sie bereits an anderer Stelle vorhanden sind. Glücklicherweise scheinen mindestens 51 Leute diese Antwort nützlich gefunden zu haben, gern geschehen!
Hier ist eine Verbesserung gegenüber die ausgezeichnete Antwort von doubletap . Das Original hat zwei Nachteile, die hier angesprochen werden:
Wie bereits von anderen erwähnt, besteht eine geringe Wahrscheinlichkeit, dass kurze Zeichenketten oder sogar eine leere Zeichenkette (wenn die Zufallszahl 0 ist) erzeugt werden, was Ihre Anwendung stören könnte. Hier ist eine Lösung:
(Math.random().toString(36)+'00000000000000000').slice(2, N+2)
Zweitens begrenzen sowohl das Original als auch die obige Lösung die Zeichenfolgengröße N auf 16 Zeichen. Die folgende Lösung liefert eine Zeichenkette der Größe N für jedes beliebige N (beachten Sie jedoch, dass die Verwendung von N > 16 weder die Zufälligkeit erhöht noch die Wahrscheinlichkeit von Kollisionen verringert):
Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)
Erläuterung:
Weitere Gedanken:
Aktualisierung:
Hier sind ein paar andere funktionale Einzeiler, die ich mir ausgedacht habe. Sie unterscheiden sich von der obigen Lösung dadurch, dass:
Angenommen, das Alphabet Ihrer Wahl lautet
var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Diese beiden sind gleichwertig, so dass Sie sich für das entscheiden können, was für Sie intuitiver ist:
Array(N).join().split(',').map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');
und
Array.apply(null, Array(N)).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');
Editar:
Ich scheine qubyte y Martijn de Milliano hat ähnliche Lösungen wie die letztgenannte gefunden (Hut ab!), die ich irgendwie übersehen habe. Da sie auf den ersten Blick nicht so kurz aussehen, lasse ich sie trotzdem hier, falls jemand wirklich einen Einzeiler braucht :-)
Außerdem habe ich in allen Lösungen "new Array" durch "Array" ersetzt, um ein paar Bytes einzusparen.
Denn die Hinzufügung von 1 löst keines der beiden hier diskutierten Probleme. Zum Beispiel ergibt (1).toString(36).substring(7) eine leere Zeichenfolge.
使用方法 Math.random().toString(36).substring(2,7)
führt zu einem erwarteten Ergebnis, das eher der .substring(2, n+2)
Die kompakteste Lösung, denn slice
ist kürzer als substring
. Durch die Subtraktion vom Ende der Zeichenkette kann das Fließkomma-Symbol vermieden werden, das von der random
Funktion:
Math.random().toString(36).slice(-5);
oder sogar
(+new Date).toString(36).slice(-5);
Aktualisierung: Ein weiterer Ansatz wurde mit btoa
Methode:
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));
Genau. ;) Und wenn Math.random()
gibt zurück. 0.5
das Ergebnis ist "0.i"
. Ich weiß nicht, ob es noch andere Fälle gibt. Ich wollte nur darauf hinweisen, dass dies keine korrekte Antwort auf die Frage ist (5 Zeichen aus [a-zA-Z0-9]).
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
91 Stimmen
Warnung: Keine der Antworten hat einen
true-random
Ergebnis! Sie sind nurpseudo-random
. Wenn Sie zufällige Zeichenfolgen zum Schutz oder zur Sicherheit verwenden, verwenden Sie keine davon! Versuchen Sie eine dieser Api's: random.org65 Stimmen
Math.random().toString(36).replace(/[^a-z]+/g, '')
24 Stimmen
Bitte legen Sie die Lösung in eine Lösung.
320 Stimmen
Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
2 Stimmen
@MuazKhan @frieder der Ergebnisbereich ist
[a-zA-Z0-9]
warum also die[^a-z]
? Und was ist mit zufälligen Großbuchstaben?0 Stimmen
@ring0 das ist ziemlich einfach, oder? .toUpperCase() am Ende
22 Stimmen
Hinweis HTML5-Webcrypto-Zufallszahlen-API bietet echte Zufälligkeit.
0 Stimmen
Wenn Sie Folgendes verwenden
Lodash
oUnderscore
entonces stackoverflow.com/questions/1349404/1 Stimmen
Ich habe @frieders Lösung mit Node.js v6.9.4 auf Fedora getestet und festgestellt, dass sie Strings mit weniger als 5 Zeichen erzeugen kann. Ich habe nicht untersucht, wie der Trick funktioniert, aber um die Lösung zu verallgemeinern, kann man eher Folgendes tun
(new Array(5)).fill(0).map(() => Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 1)).join("")
die mit beliebig langen Zielzeichenketten funktioniert.0 Stimmen
Wenn Sie faul sind und nur Zahlen benötigen, die pseudozufällig sind, können Sie dies tun:
Math.floor(Math.random() * Number.MAX_VALUE).toString()
1 Stimmen
Warum brauchen Sie diese Zeichenfolge? Eine sorgfältige Antwort wird zweifellos zu einer Art "Notwendigkeit der Einzigartigkeit" führen. In diesem Fall benötigen Sie wirklich eine Zeichenkette, die eine bestimmte Entropie repräsentiert, und nicht eine Zeichenkette mit einer bestimmten Länge und einer bestimmten Anzahl von Zeichen (wie angegeben). Wissen Sie, dass Sie eine zufällige Zeichenfolge mit 29,8 Bit Entropie angefordert haben? Warum 29,8 Bits? Ist Ihnen klar, was diese Anzahl von Bits in Bezug auf die Wahrscheinlichkeit einer Wiederholung bei der Erzeugung einer bestimmten Anzahl dieser Zeichenfolgen bedeutet? Wenn Ihnen das unklar erscheint, sehen Sie sich entropy-string an ( npmjs.com/package/entropie-string ).
8 Stimmen
Wenn jemand hier eine ID oder einen eindeutigen Bezeichner generieren möchte, lassen Sie Ihre DB diese Aufgabe erledigen oder verwenden Sie stattdessen eine UUID-Bibliothek.
0 Stimmen
Versuchen Sie die npm-Bibliothek random-ext . Es hat umfangreiche Funktionen, um zufällige Zeichenfolgen, Zahlen, Daten usw. zu erzeugen.
0 Stimmen
@Friedrich diese Antwort ist falsch. Der OP fragte nach a-z, A-Z, 0-9, dies beinhaltet keine Zahlen.
0 Stimmen
@KevinConnors Das tut mir leid.
[...Array(5)].map(() => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(Math.random()*62)]).join('')
0 Stimmen
Eine Zeile: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split("").sort(function(){return Math.random()> .5?-1:1;}).join("")
0 Stimmen
Einfacher Weg für den großen Zufallsstring: new Array(3).fill(0).map(x=>String.fromCharCode(Math.random()*25+65)).reduce((res,x)=>res+=x,'')