Ich habe eine SQL-Tabelle, die Zeichenketten als Schlüssel verwendet. Ich muss diese Zeichenfolge (max. 18 Zeichen) mit PHP in eine eindeutige (!) 4-Byte-Ganzzahl umwandeln. Kann mir jemand helfen?
Antworten
Zu viele Anzeigen?Einzigartig? Nicht möglich, tut mir leid .
Schauen wir uns das einmal genauer an:
Bei 18 Zeichen, selbst wenn man nur die 128 möglichen Zeichen von ASCII (7 Bits) annimmt, erhält man 128^18 mögliche Zeichenketten (und ich gehe nicht einmal auf die Möglichkeit kürzerer Zeichenketten ein!), was ungefähr 8E37 (8 und 37 Nullen) entspricht.
Mit einer 4-Byte-Ganzzahl erhält man 256^4 mögliche Ganzzahlen, was etwa 4E9 (4 Milliarden) entspricht.
Es gibt also etwa 4E28 mehr Zeichenketten als ganze Zahlen; eine eindeutige Zuordnung ist nicht möglich.
Daher werden Sie mit Sicherheit eine Kollision erleben, sobald Sie den 4294967297sten Schlüssel eingeben, aber es ist möglich, dass Sie eine Kollision erleben, sobald Sie mehr als einen Schlüssel eingeben.
Siehe auch: http://en.wikipedia.org/wiki/Pigeonhole_principle
Führt eine Nachschlagetabelle von Zeichenketten zu Ganzzahlen. Jedes Mal, wenn Sie auf eine neue Zeichenfolge stoßen, fügen Sie sie der Zuordnungstabelle hinzu und weisen ihr eine neue eindeutige ID zu. Dies wird für etwa 2^32 Zeichenketten funktionieren, was wahrscheinlich genug ist.
Es gibt keine Möglichkeit, dies für mehr als 2^32 verschiedene Zeichenfolgen zu tun.
Das können Sie nicht. Eine Vier-Byte-Ganzzahl kann 2^32 = 4 Milliarden Werte darstellen, was nicht ausreicht, um Ihren Zielbereich zu erfassen.
Wenn Sie derzeit weniger als 4 Milliarden Zeilen in der Tabelle haben, können Sie eine Kreuztabelle erstellen, die jeder Zeile einen inkrementellen Wert zuweist. Mit diesem Ansatz wären Sie zwar auf 4 Milliarden Zeilen beschränkt, aber für Ihre Situation ist das vielleicht in Ordnung.