【问题标题】:Fast hash function with unique hashes具有唯一哈希的快速哈希函数
【发布时间】:2013-09-12 06:37:07
【问题描述】:

我正在编写一个以文件名为键的磁盘缓存。密钥可以长于最大文件名长度,因此需要对其进行哈希处理。有哪些碰撞概率极低的快速哈希函数(这样我可以忽略它)?

基本上,我正在寻找一种更快的 MD5 替代方案,并且没有安全要求。

(平台 = Android,语言 = Java。)

【问题讨论】:

  • 1) 为什么一定要快? 2)你不能忽略碰撞。 3) 生日悖论
  • 您使用的是哪种编程语言?它没有哈希表吗?你觉得使用它的hash函数来使用文件名作为key有问题吗?
  • @wildplasser 1) 越快越好 2) 如果不太可能,我可以
  • @wildplasser 32 位哈希仍然具有不可忽视的冲突可能性。我的缓存当前使用 MD5 并假设永远不会发生冲突。所以我基本上是在寻找更快且不一定安全的 MD5。
  • xxHash 的内部状态为 128 位,与 MD5 大小相同。它目前将它们合并以创建最终的 32 位散列,但将最后一步更改为创建 64 位散列或 128 位散列并不难。 128 位可能是您正在寻找的:即使有数十亿个文件,冲突的可能性也可以忽略不计。

标签: java algorithm hash


【解决方案1】:

如果您的哈希是均匀分布的,那么您可以根据您希望在冲突之前处理的大约文件数来计算所需的哈希大小(以位为单位)。基本上,由于生日悖论,它是比特数的两倍。

因此,例如,如果您对一百万个文件后的冲突感到满意,那么您需要一个大约 40 位 log (2 * log2(1e6)) 的 has。

相反,如果哈希是 N 位,那么它适用于 2^(N/2) 个文件而不会发生冲突(或多或少)。

有很多快速哈希。例如,xxhash 是 64 位哈希,因此适用于大约 4,000,000,000 个文件。 google's fast-hash 是另一个。

如果您想要超过 64 位(在发生冲突之前超过约 40 亿个文件),那么您可以使用具有更大输出的散列或将两个 64 位散列连接在一起(一个来自原始文件的散列,一个来自原始文件的散列,一个经过修改的散列)某种方式(例如以空格为前缀)。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2014-05-11
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多