Результаты Murmurhash 2 на Python и Haskell

Haskell и Python не согласны на Murmurhash2 результаты. Python, Java и PHP вернули те же результаты, но Haskell-нет. Я делаю что-то неправильно в отношении Murmurhash2 на Haskell?

вот мой код для Haskell Murmurhash2:

import Data.Digest.Murmur32

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

и вот код, написанный на Python:

import murmur

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

питон вернулся 3650852671 пока Хэскелл вернувшись 3966683799

2 ответов


на murmur-hash пакет (я его автор) не обещает вычислять те же хэши, что и другие языки. Если вы полагаетесь на хэши, совместимые с другим программным обеспечением, которое вычисляет хэши, я предлагаю вам создать newtype обертки, которые вычисляют хэши так, как вы хотите. Для текста, в частности, нужно хотя бы указать кодировку. В вашем случае вы можете преобразовать текст в строку ASCII, используя Data.ByteString.Char8.pack, но это все равно не даст тот же хэш с ByteString экземпляр является скорее заполнителем.

кстати, я не активно улучшаю этот пакет, потому что MurmurHash2 был заменен MurmurHash3, но я продолжаю принимать патчи.


быстрый осмотр источников, похоже, что алгоритм работает на 32 бита. Версия Python получает их, просто захватывая 4 байта за раз из входной строки, в то время как версия Haskell преобразует каждый символ в один 32-разрядный индекс Юникода.

поэтому неудивительно, что они дают разные результаты.