2013-05-03 19 views
8

Haskell i Python nie wydają się zgadzać na wyniki Murmurhash2. Python, Java i PHP zwróciły te same wyniki, ale Haskell nie. Czy robię coś złego w sprawie Murmurhash2 na Haskell?Murmurhash 2 wyniki na python i Haskell

Oto mój kod Haskell Murmurhash2:

import Data.Digest.Murmur32 

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

A oto kod napisany w Pythonie:

import murmur 

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

Python powrócił 3650852671 natomiast Haskell powrócił 3966683799

+0

Cóż, * mój * Haskell daje mi 2399372562. –

+0

Jakie nasiona użyłeś do tego? –

+0

Użyłem twojego kodu bez zmian, ziarno to 1. –

Odpowiedz

3

Pakiet murmur-hash (jestem jego autorem) nie obiecuje obliczyć tych samych skrótów, jak w innych językach. Jeśli polegasz na skrótach, które mają być kompatybilne z innym oprogramowaniem, które oblicza skróty, sugeruję utworzenie wrapperów newtype, które obliczają skróty tak jak chcesz. W szczególności w przypadku tekstu należy przynajmniej określić kodowanie. W twoim przypadku możesz przekonwertować tekst na ciąg ASCII, używając Data.ByteString.Char8.pack, ale to nadal nie daje tego samego skrótu, ponieważ instancja ByteString jest bardziej zastępcza.

BTW, nie aktywnie ulepszam tego pakietu, ponieważ MurmurHash2 został zastąpiony przez MurmurHash3, ale nadal akceptuję poprawki.

+0

Nigdy nie oczekiwałem, że ty (autor) odpowiesz tutaj. Mimo to dziękuję za odpowiedź i chęć zaakceptowania ulepszeń. :) Równie dobrze, uniknę haszula całkowicie przy komunikacji haszy z programami napisanymi w innych językach Przy okazji, powyższe komentarze są nietypowe i nie są pomocne, po jakimś czasie będą je zgłaszać. –

5

Z szybkiego przeglądu ze źródeł wygląda na to, że algorytm działa na 32 bitach na raz. Wersja Pythona pobiera je po prostu pobierając 4 bajty na raz z ciągu wejściowego, podczas gdy wersja Haskella konwertuje każdy znak do pojedynczego 32-bitowego indeksu Unicode.

Dlatego nie jest zaskakujące, że przynoszą różne wyniki.

+0

Nie mogę go przetestować w tej chwili, ale jeśli nie ma żadnej innej różnicy, którą przegapiłem, hashing '" a \ 0 \ 0 \ 0 "" w Pythonie (na maszynie little-endian) powinien dawać taki sam wynik jak haszowanie '' a "' na przykład w Haskell. – hammar