如何设置ruby murmur hash的种子值

时间:2011-07-08 01:24:17

标签: ruby jruby hashcode murmurhash minhash

有没有办法设置使用ruby哈希函数的种子值(即1.9中的murmur哈希,不知道JRuby?)这样我每次运行脚本时都可以得到相同的哈希码(即多个进程或不同节点上的并行)

这样

将“这是一个测试”.hash

每当我运行这个,今天,明天,从现在开始的3周后,

都是一样的

我想这样做,所以我可以并行实现MinHash

我可以在murmur_hash gem中看到murmur hash接受种子所以我假设我可以设置种子并在我选择相同的种子时确定性地获取哈希码

2 个答案:

答案 0 :(得分:2)

尝试这个种子0xbc9f1d34,来自jeff dean的LevelDB源代码,:))

答案 1 :(得分:0)

如果任何人想知道的话,恢复这个......

您可以使用murmurhash3 gem located here

您可以覆盖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 

假设您使用相同的种子 12345678,那么您应该在任何服务器,进程,线程上重复获取相同的哈希值。

MurmurHash并行

您可以parallel gem located here

然后简单地传递要并行执行/散列的项目列表。

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

如果你没有使用另一个gem来并行执行哈希,那么这里有一个使用vanilla Ruby来让你前进的例子。
http://t-a-w.blogspot.com/2010/05/very-simple-parallelization-with-ruby.html