MD5-String als unique id
Ramy
- datenbank
Hallo miteinander,
Ich möchte mein uniqe id in der Datenbank mit md5 Verschlüsslung erstellen.
Ich erstelle in PHP es wie folgt:
$uniqeID= md5(microtime());
Ich benutze die Funktion "microtime()" als String zum verschlüsseln.
Meine Frage ist eigentlich: Wie gross ist die Wahrscheinlichkeit, dass ein MD5-String mehr als ein mal vorkommen kann. Oder kann gar nicht vorkommen, da ich die Funktion "microtime()" benutze?
Vielen Dank für Hinweise
Gruss
Ramy
Hallo,
Meine Frage ist eigentlich: Wie gross ist die Wahrscheinlichkeit, dass ein MD5-String mehr als ein mal vorkommen kann. Oder kann gar nicht vorkommen, da ich die Funktion "microtime()" benutze?
ich schätze mal ganz grob, die wahrscheinlichkeit ist so gross, wie die dass zwei request genau gleich ausgeführt werden.
du musst halt einfach, falls der schlüssel schon existiert, noch mal einen neuen generieren und einfügen
gruss
Hallo Eternius,
du musst halt einfach, falls der schlüssel schon existiert, noch mal einen neuen generieren und einfügen
Keine schlechte Idee ;), Danke
Ramy
hi,
ich schätze mal ganz grob, die wahrscheinlichkeit ist so gross, wie die dass zwei request genau gleich ausgeführt werden.
gehst du dabei davon aus, dass zu je zwei unterschiedlichen eingabewerten (hier: microtime) auch immer zwei verschiedene MD5-strings gehören würden?
damit lägst du aber falsch.
gruss,
wahsaga
Hallo,
gehst du dabei davon aus, dass zu je zwei unterschiedlichen eingabewerten (hier: microtime) auch immer zwei verschiedene MD5-strings gehören würden?
davon ging ich jetzt mal aus:-(
damit lägst du aber falsch.
ok
deswegen prüfen ob schlüssel schon existiert.
gruss
$uniqeID= md5(microtime());
Meine Frage ist eigentlich: Wie gross ist die Wahrscheinlichkeit, dass ein MD5-String mehr als ein mal vorkommen kann. Oder kann gar nicht vorkommen, da ich die Funktion "microtime()" benutze?
Überlege doch bitte mal:
1. Für gleiche Eingangsdaten muß auch die md5-Prüfsumme zwangsläufig gleich sein, denn sonst wäre es keine Prüfsumme, sondern eine Art Zufallsgenerator.
Daraus folgt: Erstellst Du in derselben Mikrosekunde zwei $uniqueID nach obiger Methode, erhältst Du zwei gleiche $uniqueID-Werte.
2. Die Zeit bewegt sich konstant vorwärts, kein Zeitpunkt wiederholt sich.
Daraus folgt: microtime() ist für sich genommen innerhalb seiner Auflösung von 1 Mikrosekunde schon eindeutig.
Ergo: Der Einsatz von md5() ist hier vollkommen und restlos überflüssig.
Davon abgesehen sei angemerkt, daß viele Datenbanken in der Lage sind, innerhalb einer Tabellenspalte eindeutige, fortlaufende Kennungen zu erzeugen. Brauchst Du innerhalb einer Mikrosekunde mehrere Kennungen, ist diese zeitunabhängige Quelle vorzuziehen.
Hallo Die allwissende Müllhalde,
- Für gleiche Eingangsdaten muß auch die md5-Prüfsumme zwangsläufig gleich sein, denn sonst wäre es keine Prüfsumme, sondern eine Art Zufallsgenerator.
Daraus folgt: Erstellst Du in derselben Mikrosekunde zwei $uniqueID nach obiger Methode, erhältst Du zwei gleiche $uniqueID-Werte.
Ja, das ist mir schon klar. Die Frage war nur: ist es möglich aus zwei verschiedenen microtime() den gleichen MD5-Schlüssl zu erhalten
Mit freundlichen Grüssen
Ramy
Ja, das ist mir schon klar. Die Frage war nur: ist es möglich aus zwei verschiedenen microtime() den gleichen MD5-Schlüssl zu erhalten
Ja. Aber warum Du unbedingt aus zwei bereits eindeutig verschiedenen Eingangswerten noch zwei eindeutig verschiedene Prüfsummen generieren mußt, möge Dein Geheimnis bleiben. Eindeutiger als eindeutig geht es nicht, zumindest nicht in diesem Universum.
Hallo
Ja. Aber warum Du unbedingt aus zwei bereits eindeutig verschiedenen Eingangswerten noch zwei eindeutig verschiedene Prüfsummen generieren mußt, möge Dein Geheimnis bleiben. Eindeutiger als eindeutig geht es nicht, zumindest nicht in diesem Universum.
Da kann ich dir nur recht geben ;)
Ich danke dir
Gruss
Ramy
md5 ist eine 'einwegverschlüsselung', d.h. es wird etwas verschlüsselt, welches aus dem schlüssel nicht rekonstruierbar ist.
dies ist z.b. bei passwörtern wichtig.
md5 kann aber keine eindeutigkeit oder unique erzeugen. es soll zwar immer einen anderen md5 wert erzeugen, wenn der ausgangswert ein anderer ist. darauf kann man sich aber nicht verlassen, da md5 ein wert aus 32 hex stellen ist. daher ist der zählbereich endlich. ist die anzahl der verschiedenen ausgangswerte größer als 32 hex stellen, muß es zwangsläufig eine kollision geben. da aber praktisch keine anzahl von 32 hex stellen gehalten werden, kommt in der praxis nahezu keine kollision vor.
nun aber zu deiner aufgabe:
warum willst du microtime verschlüsseln? ist der wert von microtime geheim? für mich ergibt es keinen sinn!
da microtime auch in vielen, vielen jahren immer noch kleiner als 32 hex stellen sein wird, halte ich eine kollision bei md5 verschlüsselung für kleiner, als die berühmte nadel im heuhaufen zu finden.