Ramy: MD5-String als unique id

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

  1. 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

    --
    no strict;
    no warnings;
    Über eine Rückmeldung freut sich später jeder, der das gleiche Problem hat und im Archiv nach einer Lösung sucht.
    1. 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

    2. 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

      1. 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

        --
        no strict;
        no warnings;
        Über eine Rückmeldung freut sich später jeder, der das gleiche Problem hat und im Archiv nach einer Lösung sucht.
  2. $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.

    1. Hallo Die allwissende Müllhalde,

      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.

      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

      1. 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.

        1. 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

  3. 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.