generateUId() tieferer Sinn?

Moin,

da ich für ein neues Template die Settings von Azure in der DB kopieren musste hab ich mir mal angeschaut wie OXID eigentlich die Keys für die DB generiert und war doch sehr erstaunt, als ich das hier gefunden habe:


public function generateUId() {
        return substr(md5(uniqid('', true) . '|' . microtime()), 0, 32);
 }

uniqid generiert doch bereits eine eindeutige ID wozu also den MD5 der eventuell die Eindeutigkeit ruinieren könnte? Außerdem gibt md5 doch auch immer einen 32 Zeichen langen String zurück (oder etwa nicht?) warum also noch der substring?

Wirkt auf mich alles etwas merkwürdig…

Gibt es da einen tieferen Sinn den ich nicht sehe?

Ich für meinen Teil habe jetzt jedenfalls in mysql einfach per md5(uuid()) meine OXIDs erstellt. Sollte doch keine Probleme machen oder?

Hallo,

eine gute Frage, wie ich finde. Der substr macht für mich erst mal auch keinen Sinn, da ein MD5-Hash IMMER 32-Zeichen (128-bit) lang ist.

uniqid generiert doch bereits eine eindeutige ID wozu also den MD5 der eventuell die Eindeutigkeit ruinieren könnte?

Die Wahrscheinlichkeit, dass deswegen ein bereits, in der selben Tabelle, bestehender Hash rauskommt ist trotzdem noch verschwindend gering.

Trotzdem würde ich mich auch über Aufklärung freuen, was das substr betrifft.

[QUOTE=KaiNeuwerth;163293]
Die Wahrscheinlichkeit, dass deswegen ein bereits, [B]in der selben Tabelle[/B], bestehender Hash rauskommt ist trotzdem noch verschwindend gering.
[/QUOTE]

Ja das stimmt natürlich. Dennoch frage ich mich wieso man die Möglichkeit für Überschneidungen, so gering sie auch sein mag wieder erhöht wo man doch mit uniqid, da es auf der Unixzeit mit Millisekunden beruht, einen nahezu perfekten eindeutigen Schlüssel bekommt.

Was ich bei genauerer Betrachtung nun auch merkwürdig finde, ist dass auch noch einmal die microtime angehängt wird. Das bringt gar nichts, da uniqid wie gesagt auf microtime beruht. Bin nun endgültig verwirrt und glaube fast man hat sich nichts dabei gedacht.