4 Stimmen

Wie kodiert man eine große Zahl (in einer URL)?

Oft muss man eine große (z.B. 128 oder 160 Bit) Zahl in einer URL verschlüsseln. Zum Beispiel verwenden viele Webanwendungen md5(random()) für UUIDs.

Wenn Sie diesen Wert in eine URL einfügen müssen, besteht die übliche Vorgehensweise darin, ihn einfach als hexadezimale Zeichenfolge zu kodieren.

Aber offensichtlich ist die Hex-Kodierung keine sehr enge Kodierung. Welche anderen Ansätze gibt es, die gut in eine URL passen?

6voto

John Punkte 5322

Ich würde das "URL und Dateinamen sichere" Base 64 Alphabet verwenden.

Base 64 verwendet zwei Zeichensätze.

Data: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
URLs: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

Um die Basis 64 zu verwenden, müssen Sie Ihren Wert so auffüllen, dass er ein Vielfaches von 3 Bytes lang ist (24 Bits) und dann diese 24 Bits in 4 6-Bit-Bytes aufteilen. Jeder 6-Bit-Wert wird nach der Position in der oben angegebenen Zeichenfolge gesucht.

Wenn alles gut geht, ist der endgültige base64-Wert immer ein Vielfaches von 4 Zeichen lang und wird in ein Vielfaches von 3 (8bit) Bytes zurückdekodiert.

Je nach verwendeter Sprache verfügen viele von ihnen über eingebaute Kodier- und Dekodierfunktionen.

3voto

Kevin Loney Punkte 7273

Noch besser geht es mit der base64-url-Kodierung (a-z, A-Z, 0-9, - und _ [siehe RFC4648 Abschnitt 5]). RFC4648 deckt eine Reihe von verschiedenen Kodierungsmethoden (base16, base32 und base64) und einige Varianten ab. Abhängig von der Spärlichkeit der Bits, die in der Zahl gesetzt sind, könnte man sie auch durch gzip laufen lassen und dann eine der beschriebenen Kodierungsmethoden verwenden. Natürlich hängt die Verwendung von gzip davon ab, wie groß die Zahl ist, die Sie kodieren wollen.

2voto

Otávio Décio Punkte 72052

Wenn Sie es eng haben wollen, können Sie eine Basis-36-Kodierung (von 0 bis Z) verwenden.

0voto

max Punkte 27697

Unter Verwendung des Hinweises auf base36 verwende ich derzeit etwas wie dieses (in Python):

>>> str(base64.b32encode(uuid.uuid1().bytes).rstrip('='))
'MTB2ONDSL3YWJN3CA6XIG7O4HM'

-2voto

wowest Punkte 1944

Verwenden Sie einfach Hex. Selbst wenn Sie 8 Bits pro Zeichen erhalten, verwenden Sie immer noch eine Zufallsfolge von 16-20 Zeichen, die niemand eingeben oder aussprechen möchte. Wenn Sie keine kurze Kennung eingeben können, sollten Sie an Ihren Suchfunktionen arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X