Ich möchte eine zufällige Zeichenfolge für die Sitzungsüberprüfung mit PostgreSQL erstellen. Ich weiß, dass ich eine Zufallszahl mit bekommen kann SELECT random()
, also habe ich es versucht SELECT md5(random())
, aber das funktioniert nicht. Wie kann ich das machen?
postgresql
random
gersh
quelle
quelle
random()
nicht erforderlich ist). Wenn es nicht das ist, was ich annehme, muss meine Antwort stattdessen auf die verfeinerte Frage ausgerichtet werden.Antworten:
Ich würde diese einfache Lösung vorschlagen:
Dies ist eine recht einfache Funktion, die eine zufällige Zeichenfolge der angegebenen Länge zurückgibt:
Und die Verwendung:
Beispielausgabe:
quelle
chars[1+random()*(array_length(chars, 1)-1)]
mitchars[ceil(61 * random())]
random()
wirdlength
mal aufgerufen (wie in vielen anderen Lösungen). Gibt es eine effizientere Möglichkeit, jedes Mal aus 62 Zeichen auszuwählen? Wie funktioniert das im Vergleich zumd5()
?ORDER BY random()
. Welche ist schneller?Sie können Ihren ersten Versuch folgendermaßen korrigieren:
Viel einfacher als einige der anderen Vorschläge. :-)
quelle
SELECT concat(md5(random()::text), md5(random()::text));
Und wenn Sie irgendwo in der Mitte möchten (z. B. 50 Zeichen), können Sie eine Teilzeichenfolge davon verwenden:SELECT substr(concat(md5(random()::text), md5(random()::text)), 0, 50);
gen_random_uuid()
: schneller, zufälliger, effizienter in der Datenbank gespeichert.SELECT md5(random()::text||random()::text);
, oderSELECT md5(random()::text||random()::text||random()::text);
Aufbauend auf Marcins Lösung können Sie dazu ein beliebiges Alphabet verwenden (in diesem Fall alle 62 alphanumerischen ASCII-Zeichen):
quelle
Check out this for a totally different method using gen_random_uuid()
: schneller, zufälliger, effizienter in der Datenbank gespeichert.Sie können 128 zufällige Bits von einer UUID erhalten. Dies ist die Methode, um die Arbeit in modernem PostgreSQL zu erledigen.
Kann sein , auch lesenswert die Dokumentationen zu UUID
Wie selten ist eine Kollision mit UUID oder erraten? Angenommen, sie sind zufällig,
Quelle: Wikipedia
Zusammenfassend,
gen_random_uuid()
ist 128 zufällige Bits, die in 128 Bits gespeichert sind (2 ** 128 Kombinationen). 0-Abfall.random()
generiert in PostgreSQL nur 52 zufällige Bits (2 ** 52 Kombinationen).md5()
als UUID gespeichert ist 128 Bit, kann aber nur so zufällig sein wie seine Eingabe ( 52 Bit bei Verwendungrandom()
)md5()
Als Text gespeichert sind 288 Bit, aber es kann nur so zufällig sein wie seine Eingabe ( 52 Bit bei Verwendungrandom()
) - mehr als doppelt so groß wie eine UUID und ein Bruchteil der Zufälligkeit)md5()
kann als Hash so optimiert werden, dass es nicht effektiv viel bewirkt.text
undvarchar
usw., die als Over gespeichert werden undvarlena
für die Länge der Zeichenfolge Overhead haben.quelle
Ich habe kürzlich mit PostgreSQL gespielt und ich denke, ich habe eine etwas bessere Lösung gefunden, indem ich nur integrierte PostgreSQL-Methoden verwendet habe - kein pl / pgsql. Die einzige Einschränkung besteht darin, dass derzeit nur UPCASE-Zeichenfolgen oder -Zahlen oder Kleinbuchstaben generiert werden.
Das zweite Argument der
generate_series
Methode bestimmt die Länge der Zeichenfolge.quelle
array_to_string(ARRAY(SELECT chr((65 + round((random()+my_id-my) * 25)) :: integer) FROM generate_series(1,8)), '')
array_to_string(ARRAY(SELECT chr((65 + round((random() * 25 + id) :: integer % 25 )) :: integer) FROM generate_series(1, 60)), '');
Bitte benutzen
string_agg
!Ich verwende dies mit MD5, um auch eine UUID zu generieren. Ich möchte nur einen zufälligen Wert mit mehr Bits als einer
random ()
ganzen Zahl.quelle
random()
bis ich die gewünschte Anzahl von Bits erhalte. Naja.Obwohl standardmäßig nicht aktiv, können Sie eine der Kernerweiterungen aktivieren:
Dann wird Ihre Anweisung zu einem einfachen Aufruf von gen_salt (), der eine zufällige Zeichenfolge generiert:
Die führende Nummer ist eine Hash-ID. Es stehen mehrere Algorithmen mit jeweils eigener Kennung zur Verfügung:
Weitere Informationen zu Erweiterungen:
BEARBEITEN
Wie von Evan Carrol angegeben, können Sie ab Version 9.4 verwenden
gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
quelle
$1$
? Das ist eine Hash-Typ-ID (md5 == 1), der Rest ist der zufällige Wert.Ich glaube nicht, dass Sie per se nach einer zufälligen Zeichenfolge suchen. Was Sie für die Sitzungsüberprüfung benötigen, ist eine Zeichenfolge, die garantiert eindeutig ist. Speichern Sie Informationen zur Sitzungsüberprüfung für die Überwachung? In diesem Fall muss die Zeichenfolge zwischen den Sitzungen eindeutig sein. Ich kenne zwei ziemlich einfache Ansätze:
UUIDs sind aufgrund ihres Generierungsalgorithmus garantiert eindeutig. Tatsächlich ist es äußerst unwahrscheinlich, dass Sie zu irgendeinem Zeitpunkt auf einem Computer zwei identische Zahlen generieren (beachten Sie, dass dies viel stärker ist als bei zufälligen Zeichenfolgen, die eine weitaus geringere Periodizität als UUIDs aufweisen).
Sie müssen die Erweiterung uuid-ossp laden, um UUIDs verwenden zu können. Rufen Sie nach der Installation eine der verfügbaren Funktionen von uuid_generate_vXXX () in Ihren SELECT-, INSERT- oder UPDATE-Aufrufen auf. Der UUID-Typ ist eine 16-Byte-Zahl, hat aber auch eine Zeichenfolgendarstellung.
quelle
Der Parameter INTEGER definiert die Länge der Zeichenfolge. Garantiert, dass alle 62 Alphanum-Zeichen mit gleicher Wahrscheinlichkeit abgedeckt werden (im Gegensatz zu einigen anderen Lösungen, die im Internet herumschwirren).
quelle
Check out this for a totally different method using gen_random_uuid()
: schneller, zufälliger, effizienter in der Datenbank gespeichert.gen_random_uuid()
erschien in Version 9.4, soweit ich das beurteilen kann, die am 18.12.2014 veröffentlicht wurde, mehr als ein Jahr nach der Antwort, die Sie abgelehnt haben. Zusätzlicher Nitpick: Die Antwort ist erst 3 1/2 Jahre alt :-) Aber Sie haben Recht, jetzt wo wir habengen_random_uuid()
, sollte dies verwendet werden. Daher werde ich Ihre Antwort positiv bewerten.@ Kavius empfahl die Verwendung
pgcrypto
, aber stattdessengen_salt
, was ist mitgen_random_bytes
? Und wie wäre essha512
stattmd5
?Docs:
quelle
select * from md5(to_char(random(), '0.9999999999999999'));
quelle
quelle