Konvertieren MD5 zu Lang
Habe ich ein 16byte array von MD5-JAVA-Methode.
Ich möchte konvertieren, um eine lange Nutzung als hashkey.
Bin Lesen ein Bitweises XOR der bits 64 ist eine gute Idee... dann howto erhalten Sie eine lange ab? vollständige code-Beispiel XOR-und cvt-zu lange bitte.
- Wenn Sie die Einnahme wurden die XOR-route, Sie würden nur XOR Hälfte des bytes mit der anderen Hälfte, seit lange ist 64 bits, die halb so viele bits wie in einem Länge-16-byte-array. Konkret: man könnte das XOR der 8 most significant bytes und die 8 niederwertigsten bytes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die beste Lösung, die ich gefunden (basierend auf meine Bedürfnisse... Mischung aus Geschwindigkeit und gute hash-Funktion) ist von Google CityHash. Die Eingabe ein byte-array mit einem MD5-Folge und die Ausgabe eine vorzeichenlose 64-bit lang.
CityHash hat eine sehr gute, aber nicht perfekte hash-distribution, und ist sehr schnell.
Ich portiert CityHash von C++ zu C# in einer halben Stunde. Ein Java-port sollte einfach zu.
Nur XORing die bits nicht so gut eine distribution (wenn auch zugegebenermaßen sehr schnell).
Ich bin nicht vertraut genug mit Java zu Ihnen genau sagen, wie das Auffüllen einer lange von einem byte-array (es könnte ein guter Helfer, ich bin nicht vertraut mit, oder ich könnte einige details der Arithmetik in Java falsch). Im wesentlichen, obwohl, werden Sie wollen, zu tun etwas wie diese:
Hinweis: ich habe keinen Versuch befassen sich mit endianness. Wenn Sie nur Sorge um eine konsistente hash-Wert, obwohl, endianness, sollte keine Rolle spielen.
Nur klar zu sein, in jedem Teilbereich eines kryptographischen digest nicht mehr viele von den kryptografischen Eigenschaften der Zusammenfassung, die genau diese Eigenschaften nicht mehr halten:
Guave hat einige sehr schöne Hashing-Funktionen:
Ich glaube, das oben ist tatsächlich CityHash aber unabhängig davon, wird es erzeugt hash-longs, die Sie verwenden können, für was auch immer Ihr hashing muss. (Ich habe versucht @Eric J. Java-code, und es sieht aus wie CityHash 32).