Результаты 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-разрядный индекс Юникода.
поэтому неудивительно, что они дают разные результаты.