Ich generiere derzeit eine 8-stellige pseudozufällige Großbuchstabenzeichenfolge für "A" .. "Z":
value = ""; 8.times{value << (65 + rand(25)).chr}
aber es sieht nicht sauber aus und kann nicht als Argument übergeben werden, da es keine einzelne Aussage ist. Um eine Zeichenfolge mit gemischten Groß- und Kleinschreibung "a" .. "z" plus "A" .. "Z" zu erhalten, habe ich sie geändert in:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
aber es sieht aus wie Müll.
Hat jemand eine bessere Methode?
reset_user_password!(random_string)
wodef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64
Antworten:
Ich verbringe zu viel Zeit mit Golfen.
Und eine letzte, die noch verwirrender, aber flexibler ist und weniger Zyklen verschwendet:
quelle
('a'..'z').to_a.shuffle[0,8].join
. Beachten Sie, dass Sie Ruby> = 1,9 bis benötigenshuffle
.SecureRandom
als ein Beispiel in den anderen Antworten.[*('a'..'z'),*('0'..'9')].shuffle[0,8].join
um eine zufällige Zeichenfolge mit Buchstaben und Zahlen zu generieren.rand
ist deterministisch und vorhersehbar. Verwenden Sie dies nicht zum Generieren von Passwörtern! Verwenden SieSecureRandom
stattdessen eine der Lösungen.Warum nicht SecureRandom verwenden?
SecureRandom bietet auch Methoden für:
Siehe: http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
quelle
require 'securerandom'
diesen nettenSecureRandom
Helfer bekommen :)SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")
generiert eine Zeichenfolge mit 0-9a-z (36 Zeichen), die IMMER 12 Zeichen lang ist. Ändern Sie 12 auf die gewünschte Länge. Leider keine Möglichkeit, AZ nur mit zu bekommenInteger#to_s
.+fGH1
eine URL passieren möchten, müssen Sie sie nur wie einen Wert, der eine URL%2BfGH1
Ich verwende dies, um zufällige URL-freundliche Zeichenfolgen mit einer garantierten maximalen Länge zu generieren:
Es werden zufällige Zeichenfolgen mit Kleinbuchstaben az und 0-9 generiert. Es ist nicht sehr anpassbar, aber es ist kurz und sauber.
quelle
rand.to_s
. hässlich, funktioniert aber.length
Länge erzeugt, ungefähr einmal in ~ 40(36**(length-1) + rand(36**length)).to_s(36)
. 36 ** (Länge 1), konvertiert in Basis 36, ist 10 ** (Länge 1). Dies ist der kleinste Wert mit der gewünschten Ziffernlänge.(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
NameError: undefined local variable or method
Länge 'für main: Object`Diese Lösung generiert eine Zeichenfolge leicht lesbarer Zeichen für Aktivierungscodes. Ich wollte nicht, dass Leute 8 mit B, 1 mit I, 0 mit O, L mit 1 usw. verwechseln.
quelle
SecureRandom.random_number(charset.size)
anstelle vonrand(charset.size)
%w{ A C D E F G H J K L M N P Q R T W X Y Z 2 3 4 6 7 9 ! @ # $ % ^ & * +}
und%w{ A D E F G H J L N Q R T Y a d e f h n r y 2 3 4 7 ! @ # $ % ^ & * }
(erste Liste enthält keine Kleinbuchstaben, aber es ist länger) Ein bisschen interessant, wie das ist hat geklappt.Andere haben etwas Ähnliches erwähnt, aber dies verwendet die URL-sichere Funktion.
Das Ergebnis kann AZ, az, 0-9, "-" und "_" enthalten. "=" Wird auch verwendet, wenn die Auffüllung wahr ist.
quelle
Seit Ruby 2.5 ist es ganz einfach mit
SecureRandom.alphanumeric
:Es generiert zufällige Zeichenfolgen, die AZ, az und 0-9 enthalten, und sollte daher in den meisten Anwendungsfällen anwendbar sein. Und sie werden zufällig sicher generiert, was ebenfalls von Vorteil sein kann.
Dies ist ein Benchmark, um ihn mit der Lösung mit den meisten positiven Stimmen zu vergleichen:
Die
rand
Lösung dauert also nur etwa 3/4 der Zeit vonSecureRandom
. Das mag wichtig sein, wenn Sie viele Zeichenfolgen generieren, aber wenn Sie von Zeit zu Zeit nur eine zufällige Zeichenfolge erstellen, würde ich immer die sicherere Implementierung wählen, da sie auch einfacher aufzurufen und expliziter ist.quelle
Generieren Sie eine zufällige Zeichenfolge mit 8 Buchstaben (z. B. NVAYXHGR).
Generieren Sie eine zufällige 8-stellige Zeichenfolge (z. B. 3PH4SWF2) ohne 0/1 / I / O. Ruby 1.9
quelle
[*("A".."Z")]'
; ((nicht einzelne Qoutes))stub
für dieserspec
zu übergeben.Ich kann mich nicht erinnern, wo ich das gefunden habe, aber es scheint mir der beste und der am wenigsten prozessintensive zu sein:
quelle
0
und1
undO
undI
fehlten absichtlich, weil diese Zeichen nicht eindeutig sind. Wenn diese Art von Code verwendet wird, um eine Reihe von Zeichen zu generieren, die ein Benutzer kopieren muss, ist es am besten, Zeichen auszuschließen, die möglicherweise nur schwer außerhalb des Kontexts zu unterscheiden sind.quelle
Random.new.bytes(9)
n=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
Wenn Sie eine Zeichenfolge mit der angegebenen Länge möchten, verwenden Sie:
Es wird eine zufällige Zeichenfolge der Länge erzeugen
2n
enthält0-9
unda-f
quelle
n
generiert, sondern eine Zeichenfolge mit einer Länge von 4/3n
..hex
es 2n ist. Dokumentation: SecureRandom.hex generiert eine zufällige hexadezimale Zeichenfolge. Das Argument n gibt die Länge der zu generierenden Zufallszahl in Bytes an. Die Länge der resultierenden hexadezimalen Zeichenfolge beträgt das Doppelte von n .Array.new(n){[*"0".."9"].sample}.join
, won=8
in deinem Fall.Verallgemeinert:
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
usw.Von: " Pseudozufallszeichenfolge AZ, 0-9 erzeugen ".
quelle
quelle
Hier ist ein einzeiliger einfacher Code für zufällige Zeichenfolgen mit der Länge 8:
Sie können es auch für ein zufälliges Passwort mit der Länge 8 verwenden:
quelle
P(36, 8) / 36^8 = 0.4
den möglichen Zeichenraum für 8 Zeichen (~ 2x leichter zu erzwingen) oderP(36, 25) / 36^25 = 0.00001
den möglichen Zeichenraum für 25 Zeichen (~ 100.000x leichter zu erzwingen).Ruby 1.9+:
quelle
map
Lösung ist wirklich schön!#sample
wie viele Elemente Sie möchten. ZBALPHABET.sample(10).join
... ruby-doc.org/core-2.4.0/Array.html#method-i-samplesample(10)
gibt Ihnen 10 einzigartige Proben. Aber Sie möchten, dass sie sich wiederholen. Aber ich würdeArray.new(10).map
für die Leistung verwendenArray.new
und deren Blocksyntax umgestellt .Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
Seien Sie sich bewusst:
rand
ist für einen Angreifer vorhersehbar und daher wahrscheinlich unsicher. Sie sollten SecureRandom auf jeden Fall verwenden, wenn dies zum Generieren von Kennwörtern dient. Ich benutze so etwas:quelle
Hier ist ein einfacher Code für ein zufälliges Passwort mit der Länge 8:
quelle
Eine andere Methode, die ich gerne benutze:
Fügen
ljust
Sie hinzu, wenn Sie in Bezug auf die richtige Zeichenfolgenlänge wirklich paranoid sind:quelle
Etwas von Devise
quelle
.tr('+/=lIO0', 'pqrsxyz')
?Ich denke, dies ist eine gute Balance zwischen Prägnanz, Klarheit und einfacher Modifikation.
Leicht zu modifizieren
Zum Beispiel einschließlich Ziffern:
Hexadezimal in Großbuchstaben:
Für eine wirklich beeindruckende Reihe von Charakteren:
quelle
Ich füge hier nur meine Cent hinzu ...
quelle
rand
Sie können
String#random
aus den Facetten von Ruby Gem verwendenfacets
.Es macht im Grunde das:
quelle
Mein Favorit ist
(:A..:Z).to_a.shuffle[0,8].join
. Beachten Sie, dass für das Mischen Ruby> 1.9 erforderlich ist.quelle
Diese Lösung benötigt externe Abhängigkeit, scheint aber hübscher als eine andere.
Faker::Lorem.characters(10) # => "ang9cbhoa8"
quelle
Gegeben:
Ein einzelner Ausdruck, der als Argument übergeben werden kann, ermöglicht doppelte Zeichen:
quelle
Die Antwort von Radar gefällt mir bisher am besten, denke ich. Ich würde ein bisschen so optimieren:
quelle
(CHARS*length).sample(length).join
?CHARS=['a','b']
dann Ihre Methode"aa"
oder"bb"
nur 33% der Zeit, aber"ab"
oder"ba"
67% der Zeit generieren würde . Vielleicht ist das kein Problem, aber es lohnt sich, daran zu denken!quelle
Meine 2 Cent:
quelle
Ich schreibe nur einen kleinen Edelstein
random_token
, um zufällige Token für den meisten Anwendungsfall zu generieren. Viel Spaß ~https://github.com/sibevin/random_token
quelle
2 Lösungen für eine zufällige Zeichenfolge bestehend aus 3 Bereichen:
Ein Zeichen aus jedem Bereich.
Und wenn Sie mindestens ein Zeichen aus jedem Bereich benötigen, z. B. ein zufälliges Passwort mit einem Großbuchstaben, einem Kleinbuchstaben und einer Ziffer erstellen, können Sie Folgendes tun:
quelle
( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) + [ "%", "!", "*" ].sample(8) ).shuffle.join #=> "Kc5zOGtM0*H796QgPp%!8u2Sxo1"
Ich habe kürzlich so etwas gemacht, um aus 62 Zeichen eine 8-Byte-Zufallszeichenfolge zu generieren. Die Zeichen waren 0-9, az, AZ. Ich hatte ein Array von ihnen, wie es 8-mal wiederholt wurde und einen zufälligen Wert aus dem Array auswählte. Dies war in einer Rails-App.
Das Seltsame ist, dass ich eine gute Anzahl von Duplikaten habe. Zufällig sollte dies so gut wie nie passieren. 62 ^ 8 ist riesig, aber von ungefähr 1200 Codes in der Datenbank hatte ich eine gute Anzahl von Duplikaten. Ich bemerkte, dass sie an Stundengrenzen voneinander passierten. Mit anderen Worten, ich könnte ein Duplikat um 12:12:23 und 2:12:22 oder so etwas sehen ... nicht sicher, ob die Zeit das Problem ist oder nicht.
Dieser Code wurde vor dem Erstellen eines ActiveRecord-Objekts erstellt. Bevor der Datensatz erstellt wurde, wurde dieser Code ausgeführt und der "eindeutige" Code generiert. Einträge in der DB wurden immer zuverlässig erstellt, aber der Code (
str
in der obigen Zeile) wurde viel zu oft dupliziert.Ich habe ein Skript erstellt, um 100000 Iterationen dieser obigen Zeile mit geringer Verzögerung zu durchlaufen, sodass es 3-4 Stunden dauern würde, in der Hoffnung, stündlich ein Wiederholungsmuster zu sehen, aber nichts zu sehen. Ich habe keine Ahnung, warum dies in meiner Rails-App passiert ist.
quelle