Konvertieren MD5 base62 für URL
Habe ich ein Skript zur Konvertierung zur Basis 62 (A-Za-z0-9), aber wie bekomme ich eine Reihe von MD5?
Habe ich an vielen stellen zu Lesen, weil die Reihe aus einem MD5 ist größer als php verarbeiten kann, als ein integer-es wird ungenau... Wie will ich eine kurz-URL trotzdem und war nicht Planung über die Verwendung der der ganze hash, vielleicht auch nur 8 Zeichen davon....
Also meine Frage ist, wie man ein Teil von der Anzahl der ein MD5-hash?
Außerdem ist es eine schlechte Idee, nur einen Teil der MD5-hash?
- md5 hash ist eine Zahl, also, was meinst du mit "Teil der Reihe"?
- md5 ist eine Zahl, dargestellt in base36 Kodierung, dachte ich...
- Sie sind halb rechts, ein md5-hash ist eine hex-Zahl dargestellt zur Basis 16 (a-f0-9).
- Nein, md5() ist standardmäßig konvertiert Basis 16 (hex), aber man kann die raw-Ausgabe auch.
- Ein md5 hash ist eine 128 bit Zahl. Die übliche Darstellung in hex, aber das ist nicht notwendig.
- ok, so wie ich das konvertieren des hex eine Zahl? Ich weiß, dass die Zahl ist zu groß für die php so zu behandeln, sollte ich die Verwendung von substr und hexdec?
- Ich bin mir dessen bewusst, dass, aber ich glaube nicht, dass er spricht über die raw-Darstellung der hash hier.
- substr und hexdec wird nicht funktionieren, da Sie nicht berechnen kann die ganze Zahl, während, bricht es in mehrere Teile mit substr.
- Mithilfe der Base64-machen Sache viel einfacher, weil es kodiert aufeinanderfolgende 3-byte-Blöcke.
- base64 ist nicht vollständig kompatibel mit URLs.
- aber wenn ich will nur einen Teil der hash-jedenfalls dann, was ist der Schaden in nur substr Teil und dann hexdec und dann base62 konvertieren?
- Ich bin verwirrt, die Sie aufnehmen möchten, Teil der md5 (Basis 16) hash, es zu konvertieren in Basis 10 umwandeln und dann wieder zur Basis 62?
- ja... es ist möglich, konvertieren gerade von 16 auf 62?
- Ja, aber abhängig von der Größe der Zahl kann es nicht ausreichen, um auf eine float-variable geben, die ich Bearbeiten werde meine Antwort in Kürze.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich vorschlagen, eine andere Sache hier.. Da sind Sie nur daran interessiert, mit einem dezimalen Teil der md5-hash warum nutzen Sie nicht andere kurze numerischen hash wie CRC32 oder Adler? Hier ist ein Beispiel:
Dadurch wird eine 8-stellige hash des Strings.
EDIT: ich glaube ich habe dich missverstanden, hier sind einige Funktionen für die Konvertierung zu und von sockel bis zu 62.
BEARBEITEN (Wieder): arbeiten mit beliebiger Länge der zahlen, die Sie müssen verwenden Sie entweder bc_math oder die GMP-Erweiterung, hier wird eine Funktion verwendet, die die bc_math Erweiterung und kann auch konvertieren von Basis 2 bis zur Basis 62. Sie sollten es verwenden, wie diese:
und die inverse:
Hoffe, es hilft. =)
Wenn es möglich ist, würde ich raten, nicht mit einem hash für Ihre URLs. Schließlich werden Sie laufen in Kollisionen... vor allem, wenn Sie mit dem abschneiden der hash. Wenn Sie gehen Sie vor und implementieren Sie eine id-basierte system, wo jedes Element hat eine eindeutige ID, wird es weit weniger Kopfschmerzen. Das erste Element wird
1
, die zweite werde2
usw---wenn Sie MySQL verwenden, nur werfen Sie in eine autoincrement-Spalte.Eine kurze id:
Eine kurze id wieder in der Basis-10 id:
Hoffe, das hilft!
Wenn Sie wirklich wollen, base 62 (was nicht getan werden kann mit
gmp
oderbase_convert
), check this out:http://snipplr.com/view/22246/base62-encode--decode/
Können Sie das in etwa so machen: (Nicht alle Schritte sind in php, es ist schon eine lange Zeit, ich habe es benutzt.)
Erstellen eines md5-hash des Skripts wie diesem:
$hash = md5(Skript, raw_output=true);
Konvertieren, dass die Zahl zur Basis 62.
Sehen, die Fragen über Basis-Konvertierung von beliebig großer zahlen in PHP
Kürzen Sie die Zeichenfolge auf eine Länge, die Sie mögen.
Gibt es kein Risiko mit nur ein paar bits von md5. Alle diese änderungen wird die Gefahr von Kollisionen.
Es ist eigentlich eine Java-Implementierung, die Sie könnte wahrscheinlich extrahieren. Es ist ein open-source-CMS-Lösung namens Pulse.
Schauen Sie hier für den code des
toBase62()
undfromBase62()
.http://pulse.torweg.org/javadoc/src-html/org/torweg/pulse/util/StringUtils.java.html
Die einzige Abhängigkeit in
StringUtils
ist die Lebenszyklus-Klasse, die einen Weg, um ein salted hash für die Zeichenkette die könnte man auch weglassen, alle zusammen oder kopieren Sie einfach die Methode über, um Ihre KopieStringUtils
. Voilá.Könnte man eine leicht modifizierte Base 64 mit
-
und_
statt+
und/
:Zusätzlich, Sie könnten entfernen Sie die nachfolgende Polsterung
=
Zeichen.Wird und sich der raw-MD5-Wert (Binär-string), legen Sie den zweiten parameter (namens
$raw_output
im Handbuch) zu wahr:Können Sie so etwas tun,
PHP 5.3.2, GMP-unterstützt sockel bis zu 62 (vorher wurde nur 36), so brianreavis s Vorschlag sehr nahe war. Ich denke die einfachste Antwort auf deine Frage ist also:
Konvertierung von Basis-16-Basis-62 hat offenbar Raum profitiert. Ein normaler 128-bit-MD5-hash ist 32 Zeichen in hex, aber in der Basis-62 sind es nur 22. Wenn Sie das speichern der hashes in einer Datenbank, können Sie konvertieren Sie raw-binary und sparen Sie noch mehr Platz (16 bytes bei MD5).
Da die resultierende hash ist nur eine string-Darstellung können Sie nur verwenden, substr, wenn Sie wollen nur ein bisschen (wie die Funktion wirkt).
Können Sie versuchen, base62x um eine sichere und kompatible codierte Darstellung.
Hier für mehr Informationen über base62x, oder einfach
-base62x
im-NatureDNS
.Hier ist ein open-source-Java-Bibliothek, konvertiert MD5-strings zu strings Base62
https://github.com/inder123/base62
Md5ToBase62.toBase62("9e107d9d372bb6826bd81d3542a419d6") ==> cbIKGiMVkLFTeenAa5kgO4
Md5ToBase62.fromBase62("4KfZYA1udiGCjCEFC0l") ==> 0000bdd3bb56865852a632deadbc62fc
Die Konvertierung zwei-Wege, so erhalten Sie den original md5 zurück, wenn Sie es zu konvertieren zurück zu md5:
Md5ToBase62.fromBase62(Md5ToBase62.toBase62("9e107d9d372bb6826bd81d3542a419d6")) ==> 9e107d9d372bb6826bd81d3542a419d6
Md5ToBase62.toBase62(Md5ToBase62.fromBase62("cbIKGiMVkLFTeenAa5kgO4")) . ==> cbIKGiMVkLFTeenAa5kgO4
``