【发布时间】:2026-01-04 00:05:02
【问题描述】:
我正在寻找一个散列函数来散列字符串。出于我的目的(在导入期间识别更改的对象),它应该具有以下属性:
快
-
可以增量使用,即我可以这样使用:
Hasher h = new Hasher(); h.add("somestring"); h.add("another part"); h.add("eveno more"); Long hash = h.create();在整个过程中不会影响其他属性或将字符串保留在内存中。
防止碰撞。如果我在余生中每天比较来自不同字符串的两个哈希值 100 万次,那么发生冲突的风险应该可以忽略不计。
它不一定要防止恶意尝试创建冲突。
我可以使用什么算法?首选在 Java 中具有现有免费实现的算法。
澄清
哈希不必很长。例如一个字符串就可以了。
要散列的数据将来自文件或数据库,其中包含许多 10MB 或最多几 GB 的数据,这些数据将分布到不同的散列中。所以将完整的字符串保存在内存中并不是一个真正的选择。
【问题讨论】:
-
“防止冲突” - 那么散列不是你要找的。span>
-
@Durandal Mind 解释为什么?
-
我猜@Durandal 想指出,每个散列函数都有冲突。我猜你想要的是一个类似输入不太可能发生冲突的函数。
-
假设您还有 10000 天。这是 10 ^ 10 对哈希值需要具有可忽略不计的相等概率 - 例如,小于 1 ppm - 与 10 ^ 16 相比较大的图像(如 63 位甚至 64 位)很容易。但是每天添加一百万个哈希码并要求每个人都是独一无二的,这会将您的预期寿命限制在 12 岁以下。