Ich möchte eine 5-stellige Zeichenfolge, die aus zufällig aus dem Satz ausgewählten Zeichen besteht [a-zA-Z0-9]
.
Was ist der beste Weg, dies mit JavaScript zu tun?
javascript
random
Tom Lehman
quelle
quelle
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 APIsMath.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Antworten:
Ich denke, das wird für Sie funktionieren:
quelle
+=
führt dies zu einem O (n ^ 2) -Verhalten. Wenn Sie längere Zeichenfolgen erstellen möchten, sollten Sie ein Array einzelner Zeichen erstellen und diese am Ende zusammenfügen.+=
ist es aus irgendeinem Grund oft schneller, sogar innerhalb von Schleifen verwendet - jsperf.com/join-vs-concatenationcrypto
stattdessen.Hinweis: Der obige Algorithmus weist die folgenden Schwächen auf:
Math.random()
Abhängig von der Implementierung kann eine vorhersagbare ("zufällig aussehende", aber nicht wirklich zufällige) Ausgabe erzeugt werden. Die resultierende Zeichenfolge ist nicht geeignet, wenn Sie die Eindeutigkeit oder Unvorhersehbarkeit garantieren müssen.quelle
Math.random().toString(36).substr(2, 5)
, weil.substring(7)
es länger als 5 Zeichen ist. Volle Punkte, immer noch!toString
Methode eines Zahlentyps in Javascript verwendet einen optionalen Parameter, um die Zahl in eine bestimmte Basis umzuwandeln. Wenn Sie beispielsweise zwei übergeben, wird Ihre Nummer binär dargestellt. Ähnlich wie bei hex (Basis 16) verwendet Basis 36 Buchstaben, um Ziffern über 9 hinaus darzustellen. Wenn Sie eine Zufallszahl in Basis 36 konvertieren, erhalten Sie eine Reihe von scheinbar zufälligen Buchstaben und Zahlen.(Math.random() + 1).toString(36).substring(7);
Math.random ist schlecht für so etwas
Option 1
Wenn Sie dies serverseitig tun können , verwenden Sie einfach das Kryptomodul -
Die resultierende Zeichenfolge ist doppelt so lang wie die von Ihnen generierten zufälligen Bytes. Jedes hexadezimal codierte Byte besteht aus 2 Zeichen. 20 Bytes sind 40 hexadezimale Zeichen.
Option 2
Wenn Sie dies clientseitig tun müssen , versuchen Sie es vielleicht mit dem uuid-Modul -
Option 3
Wenn Sie dies clientseitig tun müssen und keine alten Browser unterstützen müssen, können Sie dies ohne Abhängigkeiten tun -
Weitere Informationen zu
crypto.getRandomValues
-Hier ist ein kleines Konsolenbeispiel -
Für die IE11-Unterstützung können Sie Folgendes verwenden:
Informationen zur Browserabdeckung finden Sie unter https://caniuse.com/#feat=getrandomvalues
quelle
.map()
Option 3.Array.from(arr, dec2hex).join('')
===Array.from(arr).map(dec2hex).join('')
. Vielen Dank, dass Sie mir diese Funktionen vorgestellt haben :-)require
Modul nicht nur serverseitig verwendet werden?Kurz, einfach und zuverlässig
Gibt genau 5 zufällige Zeichen zurück, im Gegensatz zu einigen der am besten bewerteten Antworten, die hier zu finden sind.
quelle
Math.random().toString(36)
eine Zahl mit weniger als 5 Zeichen zurückgegeben wird?function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
Hier ist eine Verbesserung gegenüber der hervorragenden Antwort von doubletap . Das Original hat zwei Nachteile, die hier angesprochen werden:
Erstens, wie andere bereits erwähnt haben, besteht eine geringe Wahrscheinlichkeit, dass kurze Zeichenfolgen oder sogar eine leere Zeichenfolge (wenn die Zufallszahl 0 ist) erzeugt werden, wodurch Ihre Anwendung möglicherweise beschädigt wird. Hier ist eine Lösung:
Zweitens begrenzen sowohl das Original als auch die obige Lösung die Zeichenfolgengröße N auf 16 Zeichen. Im Folgenden wird eine Zeichenfolge der Größe N für jedes N zurückgegeben (beachten Sie jedoch, dass die Verwendung von N> 16 die Zufälligkeit nicht erhöht oder die Wahrscheinlichkeit von Kollisionen verringert):
Erläuterung:
Weitere Gedanken:
Aktualisieren:
Hier sind ein paar andere funktionale Einzeiler, die ich mir ausgedacht habe. Sie unterscheiden sich von der obigen Lösung darin, dass:
Angenommen, Sie haben das Alphabet Ihrer Wahl
Dann sind diese beiden gleichwertig, sodass Sie auswählen können, was für Sie intuitiver ist:
und
Bearbeiten:
Ich scheine qubyte zu sein und Martijn de Milliano hat ähnliche Lösungen gefunden (Lob!), Die ich irgendwie vermisst habe. Da sie auf einen Blick nicht so kurz aussehen, lasse ich es trotzdem hier, falls jemand wirklich einen Einzeiler will :-)
Außerdem wurde in allen Lösungen 'neues Array' durch 'Array' ersetzt, um ein paar weitere Bytes zu sparen.
quelle
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
ergibt ein erwartetes Ergebnis, das eher dem.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
Die kompakteste Lösung, weil sie
slice
kürzer ist alssubstring
. Durch Subtrahieren vom Ende der Zeichenfolge kann das von derrandom
Funktion erzeugte Gleitkommasymbol vermieden werden :oder auch
Update: Ein weiterer Ansatz mit der
btoa
Methode wurde hinzugefügt :quelle
Math.random().toString(36).slice(-5);
- Was ist, wennMath.random()
zurückkommt0.0
?"0"
;)Math.random()
zurückgegeben wird, ist0.5
das Ergebnis"0.i"
. Ich bin mir nicht sicher, ob es andere Randfälle gibt. Ich wollte nur darauf hinweisen, dass dies keine korrekte Antwort auf die Frage ist (5 Zeichen aus [a-zA-Z0-9]).(+new Date + Math.random())
, um diesen Fall zu verhindern. Trotzdem danke für den Hinweis.So etwas sollte funktionieren
Rufen Sie mit dem Standardzeichensatz [a-zA-Z0-9] an oder senden Sie Ihren eigenen:
quelle
len
direkt in einerwhile
Schleife dekrementierenEine neuere Version mit dem es6- Spread-Operator :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
ist willkürliche Zahl, können Sie eine beliebige Token Länge holen Sie wollen36
ist die maximale radix Nummer , die Sie weitergeben können numeric.toString () , was bedeutet , alle Zahlen und az Kleinbuchstaben2
wird verwendet, um den 3. Index aus der zufälligen Zeichenfolge auszuwählen, die so aussieht:"0.mfbiohx64i"
Wir könnten jeden Index danach nehmen0.
quelle
quelle
while(s.length< L) s+= randomchar();
while(L--)
wird es tun'A'.charCodeAt(0)
als die magische Zahl55
(und ebenso für die61
). Zumal auf meiner Plattform sowieso die magische Zahl zurückkehrt65
. Dieser Code wird sich auch besser selbst dokumentieren.Zufälliger String-Generator (Alpha-Numerisch | Alpha | Numerisch)
Während in den obigen Abschnitten zusätzliche Überprüfungen für die gewünschte A / N-, A-, N- Ausgabe verwendet werden, teilen wir sie zum besseren Verständnis auf das Wesentliche (nur alphanumerisch) auf:
var str = "";
um zufällige Zeichen zu verkettenrand
innerhalb einer Schleife eine Indexnummer von 0 bis 61 (0..9 + A..Z + a..z = 62).rand
Korrigieren (da es 0..61 ist), indem Sie sie um eine Zahl erhöhen (siehe Beispiele unten), um die richtigeCharCode
Zahl und das zugehörige Zeichen zurückzugewinnen.str
aString.fromCharCode( incremented rand )
Stellen wir uns die Bereiche der ASCII-Zeichentabelle vor:
Math.floor( Math.random * 62 )
gibt einen Bereich von0..61
(was wir brauchen).Korrigieren wir den Zufall, um die richtigen charCode-Bereiche zu erhalten :
Die bedingte Operation Logik aus der obigen Tabelle:
Aus der obigen Erklärung ergibt sich das resultierende alphanumerische Snippet :
Oder wenn Sie so wollen:
quelle
Der einfachste Weg ist:
Dadurch werden zufällige Zeichenfolgen mit 5 Zeichen basierend auf der aktuellen Zeit generiert. Beispielausgabe ist
4mtxj
oder4mv90
oder4mwp1
Das Problem dabei ist, dass, wenn Sie es zweimal in derselben Sekunde aufrufen, dieselbe Zeichenfolge generiert wird.
Der sicherere Weg ist:
Dadurch wird eine zufällige Zeichenfolge mit 4 oder 5 Zeichen generiert, die immer unterschiedlich ist. Beispielausgabe ist wie
30jzm
oder1r591
oder4su1a
In beiden Fällen generiert der erste Teil eine Zufallszahl. Der
.toString(36)
Teil wandelte die Zahl in eine Base36-Darstellung (alphadezimal) um.quelle
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
, um sie abzudecken.(Math.random()*1e20).toString(36)
.Hier sind einige einfache Einzeiler. Ändern Sie
new Array(5)
, um die Länge festzulegen.Einschließlich
0-9a-z
Einschließlich
0-9a-zA-Z
quelle
Ich weiß, dass jeder es bereits richtig gemacht hat, aber ich hatte das Gefühl, dass ich es auf die leichteste Art und Weise ausprobieren sollte (leichter Code, keine CPU):
Es braucht ein bisschen Zeit, um den Kopf herumzureißen, aber ich denke, es zeigt wirklich, wie großartig die Syntax von Javascript ist.
quelle
current = current ? current : '';
wenn Sie schreibencurrent = current || ''
;current || (current = '');
Wenn Sie Lodash oder Underscore verwenden , ist das ganz einfach:
quelle
_.sampleSize('asdfgh',5).join('')
Um die Anforderung [a-zA-Z0-9] und die Länge = 5 zu erfüllen, verwenden Sie
Kleinbuchstaben, Großbuchstaben und Zahlen werden angezeigt.
quelle
Falls jemand an einem Einzeiler interessiert ist (obwohl er für Ihre Bequemlichkeit nicht als solcher formatiert ist), der den Speicher sofort zuweist (beachten Sie jedoch, dass es für kleine Zeichenfolgen wirklich keine Rolle spielt), gehen Sie wie folgt vor:
Sie können
5
durch die Länge der gewünschten Zeichenfolge ersetzen . Vielen Dank an @AriyaHidayat in diesem Beitrag für die Lösung dermap
Funktion, die nicht mit dem von erstellt wurdeArray(5)
.quelle
Hier ist die Methode, die ich erstellt habe.
Es wird eine Zeichenfolge erstellt, die sowohl Groß- als auch Kleinbuchstaben enthält.
Außerdem habe ich die Funktion eingefügt, mit der auch eine alphanumerische Zeichenfolge erstellt wird.
Arbeitsbeispiele:
http://jsfiddle.net/greatbigmassive/vhsxs/ (nur Alpha)
http://jsfiddle.net/greatbigmassive/PJwg8/ (alphanumerisch)
Upgrade Juli 2015
Dies macht dasselbe, ist aber sinnvoller und enthält alle Buchstaben.
quelle
Angenommen, Sie verwenden Unterstriche, können Sie elegant zufällige Zeichenfolgen in nur zwei Zeilen generieren:
quelle
quelle
Schneller und verbesserter Algorithmus. Garantiert keine Uniform (siehe Kommentare).
quelle
crypto.getRandomValues
gibt einen von 256 eindeutigen Werten zurück. Da 256 nicht durch 62 geteilt wird, haben Sie am Ende eine etwas höhere Wahrscheinlichkeit, Zeichen AH zu erhalten. Ich denke, die beste Lösung besteht darin, das zu tun, was YouTube getan hat, und dem Zeichensatz nur zwei zusätzliche Zeichen (möglicherweise-
und_
) hinzuzufügen . Wie auch immer, tolle Arbeit - diese Antwort braucht so viel mehr Liebe :)Das Problem bei der Beantwortung von Fragen zu "Ich brauche zufällige Zeichenfolgen" (in welcher Sprache auch immer) ist, dass praktisch jede Lösung eine fehlerhafte primäre Spezifikation der Zeichenfolgenlänge verwendet . Die Fragen selbst zeigen selten, warum die zufälligen Zeichenfolgen benötigt werden, aber ich würde Sie herausfordern, dass Sie selten zufällige Zeichenfolgen mit einer Länge von beispielsweise 8 benötigen. Sie benötigen ausnahmslos eine Reihe eindeutiger Zeichenfolgen , die beispielsweise als Bezeichner für einen bestimmten Zweck verwendet werden sollen.
Es gibt zwei Möglichkeiten, streng eindeutige Zeichenfolgen zu erhalten: deterministisch (was nicht zufällig ist) und Speichern / Vergleichen (was belastend ist). Was machen wir? Wir geben den Geist auf. Wir gehen stattdessen mit probabilistischer Einzigartigkeit . Das heißt, wir akzeptieren, dass ein gewisses (jedoch geringes) Risiko besteht, dass unsere Saiten nicht eindeutig sind. Hier ist das Verständnis von Kollisionswahrscheinlichkeit und Entropie hilfreich.
Daher werde ich das unveränderliche Bedürfnis so umformulieren, dass einige Zeichenfolgen mit einem geringen Wiederholungsrisiko benötigt werden. Nehmen wir als konkretes Beispiel an, Sie möchten ein Potenzial von 5 Millionen IDs generieren. Sie möchten nicht jede neue Zeichenfolge speichern und vergleichen, und Sie möchten, dass sie zufällig ist, sodass Sie ein gewisses Wiederholungsrisiko akzeptieren. Nehmen wir zum Beispiel ein Risiko von weniger als 1 in einer Billion Wiederholungswahrscheinlichkeit. Also, welche Länge der Saite brauchst du? Nun, diese Frage ist nicht genau spezifiziert, da sie von den verwendeten Zeichen abhängt. Aber was noch wichtiger ist, es ist falsch. Was Sie brauchen, ist eine Angabe der Entropie der Saiten, nicht ihrer Länge. Die Entropie kann in direktem Zusammenhang mit der Wahrscheinlichkeit einer Wiederholung in einer bestimmten Anzahl von Zeichenfolgen stehen. Stringlänge kann nicht.
Und hier kann eine Bibliothek wie EntropyString helfen. So generieren Sie zufällige IDs mit einer Wahrscheinlichkeit von weniger als 1 in einer Billion Wiederholungen in 5 Millionen Zeichenfolgen mit
entropy-string
:entropy-string
Verwendet standardmäßig einen Zeichensatz mit 32 Zeichen. Es gibt andere vordefinierte Zeichensätze, und Sie können auch Ihre eigenen Zeichen angeben. Beispiel: Generieren von IDs mit derselben Entropie wie oben, jedoch unter Verwendung von Hex-Zeichen:Beachten Sie den Unterschied in der Zeichenfolgenlänge aufgrund des Unterschieds in der Gesamtzahl der Zeichen im verwendeten Zeichensatz. Das Risiko einer Wiederholung in der angegebenen Anzahl potenzieller Zeichenfolgen ist gleich. Die Stringlängen sind nicht. Und das Beste ist, dass das Wiederholungsrisiko und die potenzielle Anzahl von Zeichenfolgen explizit sind. Kein Raten mehr mit Stringlänge.
quelle
Dies ist so sauber wie es nur geht. Es ist auch schnell, http://jsperf.com/ay-random-string .
quelle
strLength - 1
: - /--strLength
zustrLength--
behebt es für mich.Sie können ein Array von Elementen durchlaufen und diese rekursiv zu einer Zeichenfolgenvariablen hinzufügen, z. B. wenn Sie eine zufällige DNA-Sequenz wünschen:
quelle
Ich habe keine saubere Lösung gefunden, um sowohl Klein- als auch Großbuchstaben zu unterstützen.
Unterstützung nur für Kleinbuchstaben:
Math.random().toString(36).substr(2, 5)
Aufbauend auf dieser Lösung zur Unterstützung von Klein- und Großbuchstaben:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
Ändern Sie die
5
insubstr(2, 5)
der Länge einstellen Sie benötigen.quelle
Einzeiler:
quelle
Array(15)
einen kleineren Wert. ZB :Array(4)
.Das funktioniert sicher
quelle
Wie wäre es mit so etwas:
Date.now().toString(36)
Nicht sehr zufällig, aber kurz und jedes Mal, wenn Sie es anrufen, ziemlich einzigartig.quelle
Date.now()
nur eine Millisekundenauflösung vorliegt. Wenn Sie beispielsweise in einer einfachen Schleife ausgeführt werden, erhalten Sie viele Duplikate.for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
.Groß- und Kleinschreibung wird nicht berücksichtigt. Alphanumerische Zeichen:
Der Vorteil dieser Funktion besteht darin, dass Sie zufällige Zeichenfolgen unterschiedlicher Länge erhalten können und die Länge der Zeichenfolge sichergestellt wird.
Groß- und Kleinschreibung beachten Alle Zeichen:
Benutzerdefinierte Zeichen
quelle
var possible
der akzeptierten Antwort ein "Gefällt mir" hinzufügen könnten , damit das Ergebnis der Funktion besser konfigurierbar ist.Generieren Sie eine 10 Zeichen lange Zeichenfolge. Die Länge wird durch einen Parameter eingestellt (Standard 10).
quelle
Sie können Coderain verwenden . Es ist eine Bibliothek, um zufällige Codes nach einem bestimmten Muster zu generieren. Verwendung
#
als Platzhalter für Groß- und Kleinbuchstaben sowie Ziffern:Es gibt andere Platzhalter wie
A
für Großbuchstaben oder9
für Ziffern.Was nützlich sein kann, ist, dass ein Anruf
.next()
immer ein eindeutiges Ergebnis liefert, sodass Sie sich nicht um Duplikate kümmern müssen.Hier ist eine Demo-Anwendung, die eine Liste eindeutiger Zufallscodes generiert .
Vollständige Offenlegung: Ich bin der Autor von Coderain.
quelle