как установить начальное значение для хэша ruby ​​murmur - PullRequest
1 голос
/ 08 июля 2011

Есть ли способ установить начальное значение для использования хэш-функции ruby ​​(т. Е. Хэша murmur в 1.9, не знаете JRuby?), Чтобы я мог получать один и тот же хэш-код каждый раз, когда запускаю скрипт (т.е. впараллельно на нескольких процессах или на разных узлах)

, поэтому

ставит «это тест» .hash

одинаково всякий раз, когда я запускаю это, сегодня, завтра,Через 3 недели и т. Д.

Я хочу сделать это, чтобы я мог параллельно реализовать MinHash

В геме murmur_hash я вижу, что хэш murmur принимает семя, поэтому я предполагаю, что могу установитьсемя и получить хэш-код детерминистически всякий раз, когда я выбираю то же самое семя

Ответы [ 2 ]

2 голосов
/ 24 июня 2016

попробуйте это начальное число 0xbc9f1d34 из исходного кода Джеффа Дина LevelDB: :)

0 голосов
/ 19 апреля 2014

Возрождая это, если кто-то хочет знать ...

Вы можете использовать murmurhash3 драгоценный камень , расположенный здесь .

Вы можете переопределить хеш-функцию, встроенную в класс String.

require 'murmurhash3'
class String

  SEED = 12345678

  def hash
    MurmurHash3::V32.str_hash(self,SEED)
  end
end

Нет, вы можете использовать эту хеш-функцию для любой строки.

$ irb
2.1.1 :001 > "this is a test".hash
=> 553036434 

Предполагая, что выиспользуйте один и тот же seed 12345678, тогда вы должны неоднократно получать один и тот же хеш на любом сервере, процессе, потоке.

MurmurHash в Parallel

Вы можете parallelgem расположенный здесь

Затем просто передайте список элементов, которые вы хотите выполнить / хэшировать параллельно.

items_to_hash = ['val0', 'val1',...., 'valN']
results = Parallel.map(items_to_hash) do |item|
   item.hash
end

Если вы не используете другой гем для выполненияпараллельные хеши, вот пример использования ванильного Ruby для начала работы.
http://t -aw.blogspot.com / 2010/05 / очень-просто-параллелизация-с-ruby.html

...