2013-05-03 8 views
8

Haskell und Python scheinen sich nicht auf Murmurhash2-Ergebnisse zu einigen. Python, Java und PHP gaben die gleichen Ergebnisse zurück, Haskell jedoch nicht. Mache ich etwas falsch in Bezug auf Murmurhash2 auf Haskell?Murmurhash 2 Ergebnisse auf Python und Haskell

Hier ist mein Code für Haskell Murmurhash2:

import Data.Digest.Murmur32 

    main = do 
    print $ asWord32 $ hash32WithSeed 1 "woohoo" 

Und hier ist der Code in Python geschrieben:

import murmur 

if __name__ == "__main__": 
    print murmur.string_hash("woohoo", 1) 

Python zurück 3650852671 während Haskell 3966683799

zurück
+0

Nun, * meine * Haskell gibt mir 2399372562. –

+0

Welchen Samen haben Sie dafür verwendet? –

+0

Ich habe Ihren Code ohne Änderungen verwendet, der Seed ist 1. –

Antwort

3

Das murmur-hash Paket (ich bin sein Autor) verspricht nicht, die gleichen Hashes wie andere Sprachen zu berechnen. Wenn Sie sich darauf verlassen, dass Hashes mit anderer Software kompatibel sind, die Hashes berechnet, schlage ich vor, dass Sie newtype Wrapper erstellen, die Hashes berechnen, wie Sie es wollen. Insbesondere für Text müssen Sie mindestens die Kodierung angeben. In Ihrem Fall könnten Sie den Text in eine ASCII-Zeichenfolge mit Data.ByteString.Char8.pack konvertieren, aber das gibt Ihnen immer noch nicht den gleichen Hash, da die ByteString Instanz eher ein Platzhalter ist.

Übrigens, ich verbessere dieses Paket nicht aktiv, weil MurmurHash2 durch MurmurHash3 ersetzt wurde, aber ich akzeptiere weiterhin Patches.

+0

Ich habe nie erwartet, dass Sie (der Autor) hier antworten. Danke trotzdem für die Antwort und die Bereitschaft, Verbesserungen zu akzeptieren. :) Macht auch, ich werde Hashing auf Haskell vollständig vermeiden, wenn ich Hashes mit in anderen Sprachen geschriebenen Programmen kommuniziere BTW, Anmerkungen oben sind offtopic und nicht hilfreich, werden sie nach einer Weile kennzeichnen. –

5

Von einer schnellen Inspektion der Quellen sieht es so aus, als ob der Algorithmus mit 32 Bits gleichzeitig arbeitet. Die Python-Version ruft diese ab, indem sie einfach 4 Bytes gleichzeitig aus der Eingabezeichenfolge aufnimmt, während die Haskell-Version jedes Zeichen in einen einzelnen 32-Bit-Unicode-Index konvertiert.

Es ist daher nicht verwunderlich, dass sie zu unterschiedlichen Ergebnissen führen.

+0

Ich kann es im Moment nicht testen, aber wenn es keinen anderen Unterschied gibt, den ich vermisst habe, sollte das Hashing "a \ 0 \ 0 \ 0" 'in Python (auf einem Little-Endian-Rechner) dasselbe Ergebnis wie Hashing ergeben "a" in Haskell zum Beispiel. – hammar