Was ich versuche, ist, eine 12-stellige ID für Artikel auf meiner Website zu erstellen, ähnlich wie youtube ihre Video-ID verarbeitet ( Ссылка ). Im Moment erzeuge ich einen MD5-Hash und packe dann 12 Zeichen davon:
%Vor%Dabei ist $ currentID die numerische ID aus der Datenbank (z. B. 144)
Ich bin etwas paranoid, dass ich auf eine doppelte $ ArticleId stoße, aber realistisch, was sind die Chancen, dass dies passieren wird? Und da die Spalte in meiner Datenbank eindeutig ist, wie kann ich mit diesem seltenen Szenario umgehen, ohne dass ein hässlicher Fehler ausgelöst wird?
P.S. Ich habe ein kleines Skript erstellt, um nach Duplikaten innerhalb der ersten 5000 $ ArticleId zu suchen, und es gab keine.
BEARBEITEN: Ich mag die Art, wie die base64_encode Hashes aussehen, also tat ich das:
%Vor%Da die AID-Spalte eindeutig ist, wird die mysql_query einen Fehler ausgeben und die retryAID-Funktion wird eine eindeutige ID finden ...
Gibt eine 12-stellige Zahl in der Basis 36 zurück, die 4.738.381.338.321.616.896 Möglichkeiten ergibt. (Die Wahrscheinlichkeit einer Kollision hängt von der Verteilung des Zufallszahlengenerators ab.)
Um keine Kollisionen zu gewährleisten, müssen Sie eine Schleife erstellen:
%Vor%Was ist falsch an der Verwendung einer sequenziellen ID? Die Datenbank wird dies für Sie erledigen.
Abgesehen davon sind 12 Zeichen immer noch 96 Bits. 2 96 = 79228162514264337593543950336 mögliche Hashes. Obwohl bekannt ist, dass MD5 Kollisionsschwachstellen hat, gibt es einen großen Unterschied zwischen der Möglichkeit einer Kollision und der Wahrscheinlichkeit , einen solchen tatsächlich zu sehen.
Basierend auf dem Rückgabewert der PHP md5 Funktion, die Sie verwenden, sind meine Zahlen oben aufgeführt ganz richtig.
Gibt den Hash als 32-stellige Hexadezimalzahl zurück.
Da Sie 12 Zeichen aus einer Hexadezimalzahl mit 32 Zeichen (und nicht aus 12 Byte des 128-Bit-Hashwerts) nehmen, beträgt die tatsächliche Anzahl der möglichen Hashwerte 16 12 = 281474976710656. Immer noch ein paar.
Tags und Links php md5 uniqueidentifier