Performance 快速且(实际上)无冲突的散列

Performance 快速且(实际上)无冲突的散列,performance,security,hash,hash-collision,Performance,Security,Hash,Hash Collision,我有一个计算长路径的对象。如果计算的路径相同,则两个对象相等。我之前测试过两个对象是否相等,方法如下: obj1.calculatePath() == obj2.calculatePath() 但是,现在这已经成为性能瓶颈。我尝试将路径存储在对象中,但由于我有很多对象,这反而成了内存问题 我估计64位散列应该足以避免冲突——假设该散列是良好的双射 因此,由于通常的快速哈希杂音等确实有冲突,我想避免它们,因为它听起来像一个头痛的时候,你可以只使用像SHA-2的哈希。如果我可以信任散列,而不是在两

我有一个计算长路径的对象。如果计算的路径相同,则两个对象相等。我之前测试过两个对象是否相等,方法如下:

obj1.calculatePath() == obj2.calculatePath()
但是,现在这已经成为性能瓶颈。我尝试将路径存储在对象中,但由于我有很多对象,这反而成了内存问题

我估计64位散列应该足以避免冲突——假设该散列是良好的双射

因此,由于通常的快速哈希杂音等确实有冲突,我想避免它们,因为它听起来像一个头痛的时候,你可以只使用像SHA-2的哈希。如果我可以信任散列,而不是在两个对象的散列匹配的情况下进行额外的检查,那就更好了

然而,与MD系列等较旧的散列函数相比,SHA的速度也很慢。我想知道,使用MD5甚至MD4这样的函数会更好


所以我的问题是:假设没有邪恶的黑客,他们的动机是用精心编制的输入创建冲突,而只是良性的随机输入。对于代码中性能关键的部分,我应该选择哪个哈希函数,以避免使用不安全的哈希杂音增加复杂性。

没有更多信息,很难提供帮助。 目前,任何人都可以推荐通用哈希函数。 有一个元素,让一些尝试

FNV-1a

通常是一个不太寒酸的起点。 这是一个易于实现的方法,b通常不是“坏的”,c在计算上很便宜,因此适用于“长”路径问题

但我想知道的是:

这些路径在什么空间?x,y,z,t中的空间是真实的时空轨迹吗?路径是通过某种图形的吗?它们是文件路径吗?还有别的吗


如果没有更多的上下文,很难说得更多。

我不确定你的问题是否有意义。根据定义,所有哈希都有冲突。您说这已经成为性能瓶颈,但是计算散列并进行比较(根据定义)要比比较原始值慢。您已经说过,您有足够的对象,因此路径列表变成了内存问题—什么构成内存问题?你是在一台拥有256MB内存的机器上运行,还是真的拥有数百万个具有1000个字符路径的对象?@DanPuzey谢谢你抽出时间。我知道所有的散列都有冲突,这是我的名字,实际上是这么说的。也许这篇文章的其余部分还不清楚。然而,在英语中,杂音甚至在词内有冲突。在MD5中,碰撞是非常罕见的,因此有人悬赏只是为了找到一个。我认为这是有区别的。我没有几百万条路,但可能有一百万条,我不知道它们的长度。但是,我确实在一个自定义的速度和内存受限的环境中运行。因此,如果您有一个受限的环境,您可能应该共享这些限制。事实上,你的问题很难回答。同样值得注意的是,在对文件路径进行哈希运算时,即使在英语单词中出现杂音,也不会产生冲突。您是否尝试过对大量数据样本进行散列以查看是否存在冲突?同样值得注意的是:根据定义,没有双射散列。你可以说一个散列对于一个精心选择的可用输入子集是双射的,但是如果没有对你的输入实际运行散列,那么就没有任何方法可以计算出哪个散列对你的输入是双射的,这是没有人会为你做的。我对你的问题的困难在于,正如我写的那样,它所问的问题无法客观地得到回答,因此最好的答案可能是:去测试一些散列算法并找出答案。