2

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

以便

提出“这是一个测试”.hash

每当我运行它时,今天,明天,从现在起的 3 周等时都是一样的

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

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

4

2 回答 2

3

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

于 2016-06-24T07:54:36.323 回答
1

如果有人想知道,请恢复这个...

您可以使用位于此处murmurhash3的gem 。

您可以覆盖类中内置的哈希函数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宝石

然后只需传递要并行执行/散列的项目列表。

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

如果你不喜欢使用另一个 gem 来并行执行哈希,那么这里有一个使用 vanilla Ruby 的例子来帮助你。
http://taw.blogspot.com/2010/05/very-simple-parallelization-with-ruby.html

于 2014-04-18T20:05:09.053 回答