Auf der Suche nach einer einfachen Funktion die einen unique-String/SessionID erzeugt habe ich mir kurzfristig eine eigene Funktion geschrieben, die verschied. Strings kombiniert und mehrfach MD5-kodiert.
Die Funktion hat den Vorteil, dass definitiv einzigartige Strings erzeugt werden (z.B. für SessionIDs), ohne eine Unique-Prüfung per Datenbank durchführen zu müssen.
Hier die Funktion:
function create_sessid() {
$token1 = md5(uniqid(rand(), true));
$token2 = md5(uniqid(rand(), true));$token3 = md5(uniqid(rand(), true));
$token4 = md5(uniqid(rand(), true));$zufall = $token1.”-”.$token2;
$zufall = md5($zufall);$zufall2 = $token3.”-”.$token4;
$zufall2 = md5($zufall2);$sessiid = md5($zufall2.$zufall);
return $sessiid;
}
Danke, sieht wirklich gut aus! Habe Unique Strings bisher immer in der Datenbank abgelegt und später auf doppelte Einträge überprüft. Werde deine Methode aber mal im größerem Umfang testen. Sobald ich Ergebnisse hab, meld ich mich wieder
beste Grüße,
Niko
hallo,
ich hab einen Test gemacht mit 2 Mio. Durchläufen, da ist kein doppelter String erzeugt worden. Werde jedoch heute Nacht nochmal einen Test laufen lassen. Falls sich herausstellt, das doppelte Einträge herauskommen melde ich mich wieder.
Wo liegt hier der Vorteil gegenüber der Nutzung der in PHP integrierten Session-Verwaltung[1]? Ernst gemeinte Frage. Geht’s darum auf Cookies oder Übertragung in der URL zu verzichten und die ID in den HTTP-Headern zu
senden?
[1] http://de.php.net/session
Der Klempner
Von Vorteil an sich kann man nicht reden, da die Funktion oben nicht auf die integrierte Session-Verwaltung abzielt.
Die Funktion kann z.B. verwendet werden wenn als Session Management eine eigene Lösung oder z.B. MemCache verwendet wird, in der man die SessionIDs manuell erzeugt. Vorteil der obigen Lösung ist, das keine Duplikatsprüfung z.B. per Datenbank (= Serverlastig) benötigt wird.
Weiterhin kann die Funktion auch für Zufallsstrings (Userfreischaltung, Links etc.) verwendet werden.
Hallo,
die PHP-Funktion session_id() liefert auch eine Unique-Id. Einzigartig in Bezug auf gleichzeitige Sessions auf der Webseite.
Meiner Meinung nach ist bereits
md5(uniqid(rand(), true).uniqueid(rand(), true))
völlig ausreichend. Die Frage ist doch, wann dieser Aufruf denselben Wert liefert – und das wären folgende 2 Fälle:
1. Die MD5-Funktion liefert dasselbe Ergebnis für zwei unterschiedliche Werte. Theoretisch ist das möglich, aber unwahrscheinlich (ca. 1:1,8e+19). Unabhängig davon wäre es nicht zu beeinflussen.
2. Die Funktion wird auf die Millisekunde genau zur selben Zeit und mit demselben Initialwert des Zufallsgenerators aufgerufen. Das ist auch unwahrscheinlich, tritt dieses Ereignis aber dennoch ein, so kann auch die weitere Verwendung desselben Zufallsgenerators das Ergebnis (nämlich 2 mal dieselbe Session-ID) nicht ändern. Einzig die Rechenzeit, die zur Ausführung der Operation benötigt wird, kann auf dem Server einen tatsächlich zufälligen Wert herbeiführen, weshalb uniquid zweimal aufgerufen wird; allerdings muss man auch dann darauf bauen, dass 2 Anfragen unterschiedlich schnell bearbeitet werden – falls nicht, schadet der doppelte Aufruf von uniqid aber auch nicht.
Liebe Grüße!
Ich meine natürlich:
md5(uniqid(rand(), true).uniqid(rand(), true))
Und noch zwei kleine Korrekturen:
- Der erste Fall tritt mit einer Wahrscheinlichkeit von rund 1:3,4e+38 ein – er tritt also nicht ein.
- Auch im laufenden Text heißt es “uniqid”…
Liebe Grüße!