如何在没有键的情况下向现有哈希添加值

时间:2016-06-14 11:49:15

标签: ruby hash

我需要在没有给出密钥的情况下将数字0-100000分配给哈希。

Ruby使用Murmur作为哈希函数。如何在没有键的情况下添加值,比如在C中,让它处理碰撞和其他事情。可能吗?我可以只给哈希值,让它评估密钥,然后插入自己吗?

在正常的散列操作中,我们有一个散列函数和一个表。我们使用value作为哈希函数的参数,然后我们得到一个键作为回报。该值将插入表中的键位置(如果发生冲突,则使用双重哈希或其他内容)。

是否可以在Ruby中执行相同类型的散列?还是我坚持默认方式?我可以将值抛出到函数中,然后计算密钥,然后将值插入哈希表吗?

2 个答案:

答案 0 :(得分:1)

使用计算的密钥哈希值存储到哈希值中,而不是密钥本身:

hash[hash_func(key)] = value

也就是说,而不是映射key - >直接value,此地图hash_func(key) - >值。实现可以在内部通过另一个哈希函数传递哈希键值,但是你不需要关心它。

然而,在评论中,现在发现您希望将哈希函数应用于,而不是任何其他键。在这种情况下,只需使用set并完成它。然后,您需要做的就是为集合添加值:

s = Set.new
s.add(value)

没有必要计算任何东西的哈希值; Set会为你照顾它。

简而言之,这似乎是XY Problem的情况。您需要在数据结构中存储一组值(并且可能能够检查这些值是否以有效的方式存储)。你没有询问这个问题,而是询问了散列函数和表格。如果您曾询问过您真正需要什么,而不是询问您认为可以用来解决原始问题的其他内容,那么您可以更快地获得有用的答案。

答案 1 :(得分:0)

常见的解决方案是简单地将值用作键。因此:

value = "xxx"
hash[value] = 1

通过这种方式,您可以清楚地记录此特定哈希的实际值(所有1)没有用,并且您将获得重复数据删除的值。 Hash将在内部进行常规散列,您根本不必担心它。

我在这里使用1作为值,但实际值完全无关紧要。我不使用nil,因为这是hash[nonexistant_value]的默认返回值。

如果您的价值观更为复杂,请查看http://docs.ruby-lang.org/en/2.0.0/Hash.html了解相关信息。