有没有办法设置使用 ruby 散列函数的种子值(即 1.9 中的杂音散列,不知道 JRuby?),这样我每次运行脚本时都可以获得相同的散列码(即在多个进程或在不同的节点上)
以便
提出“这是一个测试”.hash
每当我运行它时,今天,明天,从现在起的 3 周等时都是一样的
我想这样做,这样我就可以并行实现 MinHash
我可以在 murmur_hash gem 中看到 murmur 哈希接受种子,所以我假设我可以设置种子并在选择相同种子时确定性地获取哈希码
有没有办法设置使用 ruby 散列函数的种子值(即 1.9 中的杂音散列,不知道 JRuby?),这样我每次运行脚本时都可以获得相同的散列码(即在多个进程或在不同的节点上)
以便
提出“这是一个测试”.hash
每当我运行它时,今天,明天,从现在起的 3 周等时都是一样的
我想这样做,这样我就可以并行实现 MinHash
我可以在 murmur_hash gem 中看到 murmur 哈希接受种子,所以我假设我可以设置种子并在选择相同种子时确定性地获取哈希码
试试这个种子 0xbc9f1d34,来自 jeff dean 的 LevelDB 源代码,:)
如果有人想知道,请恢复这个...
您可以使用位于此处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
,那么您应该在任何服务器、进程、线程上重复获得相同的哈希值。
你可以在这里找到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