我正在解析大量的网络跟踪数据。我想将跟踪分成块,散列每个块,并存储一系列生成的散列而不是原始块。我的工作目的是识别相同的数据块 - 我正在对原始块进行散列以减少数据集大小以供以后分析。在我的工作中可以接受的是,为了减少散列大小,偶尔会发生冲突的可能性(例如,具有1%相同块的错误识别的40位散列可能击败具有0.001%错误识别的60位散列)。
我的问题是,给定a)要散列的块数和b)允许的错误识别百分比,如何选择合适的散列大小?
举个例子:
1,000,000个块要进行哈希处理,我们准备将1%的误识别(1%的哈希块在原始数据中不相同时看起来相同)。我们如何选择满足此要求的最小位数的哈希?
我查看了有关Birthday Paradox的材料,但这特别关注单碰撞的概率。我还研究了一些材料,讨论根据单次碰撞的可接受概率选择尺寸,但未能从中推断如何根据 n 的可接受概率选择尺寸(或更少)碰撞。
答案 0 :(得分:1)
显然,哈希函数的质量很重要,但是一些简单的概率理论可能会对你有帮助。
问题是你究竟愿意接受什么,只要1%的数据有预期的碰撞次数就足够了吗?或者,你是否要求碰撞数量超过某些界限的概率是什么?如果是第一个,那么后面的信封样式计算将会:
在你的集合中散列到同一个东西的预期对数是(1,000,000 C 2)* P(任何两个是一对)。让我们假设第二个数字是1 / d,其中d是哈希表的大小。 (注意:期望是线性的,所以到目前为止我并没有作弊)。现在,你说你想要1%的碰撞,所以总共是10000。好吧,你有(1,000,000 C 2)/ d = 10,000,所以d =(1,000,000 C 2)/ 10,000,根据谷歌约50,000,000。
因此,您需要5000万个可能的哈希值。这是一个不到2 ^ 26,所以你将得到你想要的性能约26位散列(取决于散列算法的质量)。我可能在那里有两个错误因素,所以你知道,它的粗糙。
如果这是离线任务,则 空间不受约束。
答案 1 :(得分:-1)
听起来很有趣!
其他人可能会有更好的答案,但如果有充足的时间,我会选择强力路线:
使用增量散列大小运行散列计算,并记录每个散列大小的冲突百分比。
您可能希望使用二分搜索来缩小搜索空间。