Kai: unique_id()

Hallo,

wie sicher ist eigentlich, dass nicht zufällig doch 2 identische IDs erzeugt werden?

Gruß, Kai

  1. wie sicher ist eigentlich, dass nicht zufällig doch 2 identische IDs erzeugt werden?

    2x zur gleiche Zeit ausgeführt liefert uniqid() auch auf unterschiedlichen Systemen exakt denselben Wert.

  2. Hi!

    wie sicher ist eigentlich, dass nicht zufällig doch 2 identische IDs erzeugt werden?

    Wenn du uniqid() statt unique_id() meinst, dann kommt es drauf an. Laut Handbuch wird die aktuelle Zeit in Microsekunden dazu verwendet. Bei einem kontinuierlich fortlaufendem System dürfte das ausreichend eindeutig sein. Wenn die Urzeit jedoch davonläuft und gelegentlich zurückgestellt wird, dann ich mir schon Implikationen vorstellen. Es sei denn, es wird die Zeit seit dem Systemstart verwendet, aber das ist ja gleich deutlich ungünstiger, wenn man es mal neustartet.

    Zwei weitere Parameter sind einmal der von dir vergebene Prefix und der Parameter more_entropy, womit das Ergebnis noch eindeutiger wird.

    Aber abgesehen davon, was ist eigentlich deine Befürchtung / dein Anwendungsfall? Doppelte Werte lassen sich in der Regel verhindern, indem man den neuen Wert gegen eine List der vorhandenen Werte prüft - vorausgesetzt dass sie alle zur Prüfung verfügbar sind.

    Lo!

  3. Moin!

    Hallo,

    wie sicher ist eigentlich, dass nicht zufällig doch 2 identische IDs erzeugt werden?

    Auf einundderselben Maschine? Unwahrscheinlich.

    Außerdem gibts ja noch Funktionsparameter.

    - Sven Rautenberg

    1. Auf einundderselben Maschine? Unwahrscheinlich.

      Wie war das mit "unwahrscheinlich" in der Krypographie?

      Für sichere Tokens wird doch vielerorts eplizit von "Timestamp durch Hashfunktion jagen" abgeraten, wie diese einfach zu erraten sind.

      uniqid() ist auch nur um den Faktor 1000 genauer weil es halt mit ms funtkioniert - warum sollten die also signifikant schwieriger zu erraten sein?

      Die Frage ist nicht, wie wahrscheinlich das ist sondern ob es für den benötigten Zweck ausreicht.

      Dass ein geschätztes "unwahrscheinlich" böse ins Auge gehen kann, zeigt ja das Geburtstagsparadoxon sehr eindrucksvoll.

      1. Moin!

        Auf einundderselben Maschine? Unwahrscheinlich.

        Wie war das mit "unwahrscheinlich" in der Krypographie?

        uniqid() behauptet nicht von sich, kryptographisch zu sein. Es erzeugt, ausweislich seines Namens, eine eindeutige ID. Das Mysql-Autoincrement-Feature macht übrigens dasselbe. ;)

        Die Unwahrscheinlichkeit des parallelen, gleichzeitigen Erzeugens derselben ID liegt darin begründet, dass dazu absolute Gleichzeitigkeit notwendig wäre, um beispielsweise denselben Code in mehr als einem CPU-Kern zur gleichen Zeit zu starten und in die Berechnung dieselben Eingangsparameter einfließen zu lassen. Das wird allein deshalb schon sehr schwierig, weil beispielsweise Netz-Requests seriell über die Leitung kommen, insofern also nicht gleichzeitig abgearbeitet werden.

        Für sichere Tokens wird doch vielerorts eplizit von "Timestamp durch Hashfunktion jagen" abgeraten, wie diese einfach zu erraten sind.

        uniqid() macht kein sicheres Token. Es macht einen eindeutigen Bezeichner.

        uniqid() ist auch nur um den Faktor 1000 genauer weil es halt mit ms funtkioniert - warum sollten die also signifikant schwieriger zu erraten sein?

        Die Frage ist nicht, wie wahrscheinlich das ist sondern ob es für den benötigten Zweck ausreicht.

        Der Zweck ist genau der springende Punkt. uniqid() ist brauchbar, wenn man analog zu auto_increment einen eindeutigen Bezeichner braucht, der nicht unratbar sein soll, aber eben einfach eindeutig, und bei dem man keinen globalen Counter implementieren will.

        Dass ein geschätztes "unwahrscheinlich" böse ins Auge gehen kann, zeigt ja das Geburtstagsparadoxon sehr eindrucksvoll.

        - Sven Rautenberg