1

我知道 jenkinshash 会为给定值生成一个整数 (2^32)。此链接上的文档:http: //hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/JenkinsHash.html

说返回:一个 32 位的值。键的每一位都会影响返回值的每一位。相差一位或两位的两个键将具有完全不同的哈希值。

jenkinshash 对于给定值最多可以返回 2^32 个不同的结果。如果我有超过 2^32 个值怎么办?它会为两个不同的值返回相同的结果吗?

谢谢

4

1 回答 1

2

与大多数哈希函数一样,是的,它可能会为不同的输入数据返回重复的哈希值。根据您链接到的文档,保证是一位或两位不同的值是不同的。一旦它们与 3 位或更多位不同,您就没有唯一性保证。

散列函数的输入数据可能比散列的输出具有更大的大小(具有更多唯一的输入值)。这很容易使输出数据中必须存在重复项。考虑一个在范围内输出整数1-10但在范围内接受输入的散列函数1-100:很明显,多个值必须散列到相同的值,因为您不能1-100仅使用十个不同的整数来枚举值。这被称为鸽巢原理

然而,任何好的散列函数都会尝试平均分配输出值。在1-10示例中,您可以期望一个好的散列函数给出与 a2大致相同的次数6

保证唯一性的散列函数称为完美散列函数。它们都提供至少与输入数据具有相同基数的输出数据。输入整数的完美散列函数1-100必须至少有 100 个不同的输出值。

请注意,根据维基百科,詹金斯散列函数不是加密的。这意味着您应该避免使用它们来确保密码安全等,但您可以使用散列来进行一些均匀的工作分配和校验和。

于 2013-04-19T14:08:13.513 回答