Hash 为给定允许的冲突数选择最小哈希大小

Hash 为给定允许的冲突数选择最小哈希大小,hash,size,probability,collision,Hash,Size,Probability,Collision,我正在解析大量的网络跟踪数据。我想将跟踪分割成块,对每个块进行散列,并存储结果散列的序列,而不是原始块。我工作的目的是识别相同的数据块——我对原始数据块进行散列,以减少数据集的大小,以便以后进行分析。在我的工作中,为了减小散列大小,我们可以权衡偶尔发生冲突的可能性(例如,40位散列中相同块的错误识别率为1%,可能会超过60位散列中的错误识别率为0.001%) 我的问题是,给定a)要散列的块数和b)允许的误认百分比,如何选择合适的散列大小 例如: 1000000个要散列的块,我们准备有1%的错误识

我正在解析大量的网络跟踪数据。我想将跟踪分割成块,对每个块进行散列,并存储结果散列的序列,而不是原始块。我工作的目的是识别相同的数据块——我对原始数据块进行散列,以减少数据集的大小,以便以后进行分析。在我的工作中,为了减小散列大小,我们可以权衡偶尔发生冲突的可能性(例如,40位散列中相同块的错误识别率为1%,可能会超过60位散列中的错误识别率为0.001%)

我的问题是,给定a)要散列的块数和b)允许的误认百分比,如何选择合适的散列大小

例如:

1000000个要散列的块,我们准备有1%的错误识别(当它们在原始数据中不相同时,1%的散列块看起来是相同的)。我们如何选择一个具有最小位数的散列来满足这个要求


我已经看过了关于碰撞的材料,尽管这是关于单个碰撞的概率的。我还研究了一些材料,这些材料讨论了如何根据单个碰撞的可接受概率选择尺寸,但无法由此推断如何根据n次(或更少)碰撞的可接受概率选择尺寸

显然,哈希函数的质量很重要,但一些简单的概率理论可能会对您有所帮助

问题是你到底愿意接受什么,在只有1%数据的情况下,你的预期碰撞次数是否足够好?或者,你要求碰撞次数超过某个界限的概率是多少?如果是第一个,则信封背面样式计算将执行以下操作:

从集合中散列到同一事物的预期对数为(1000000 c2)*p(任意两个都是一对)。假设第二个数字是1/d,其中d是哈希表的大小。(注意:期望值是线性的,所以到目前为止我没有太多作弊)。现在,你说你想要1%的碰撞,所以总共是10000次。好的,你有(1000000c2)/d=10000,所以d=(1000000c2)/10000,根据谷歌的数据,大约是50000000

因此,您需要一个5000万个可能的哈希值。这是一个小于2^26的值,所以您可以通过大约26位的散列(取决于散列算法的质量)获得所需的性能。我可能在某个地方犯了2个错误,所以你知道,这很艰难


如果这是一项脱机任务,您就不能受空间限制

显然,哈希函数的质量很重要,但一些简单的概率理论可能会对您有所帮助

问题是你到底愿意接受什么,在只有1%数据的情况下,你的预期碰撞次数是否足够好?或者,你要求碰撞次数超过某个界限的概率是多少?如果是第一个,则信封背面样式计算将执行以下操作:

从集合中散列到同一事物的预期对数为(1000000 c2)*p(任意两个都是一对)。假设第二个数字是1/d,其中d是哈希表的大小。(注意:期望值是线性的,所以到目前为止我没有太多作弊)。现在,你说你想要1%的碰撞,所以总共是10000次。好的,你有(1000000c2)/d=10000,所以d=(1000000c2)/10000,根据谷歌的数据,大约是50000000

因此,您需要一个5000万个可能的哈希值。这是一个小于2^26的值,所以您可以通过大约26位的散列(取决于散列算法的质量)获得所需的性能。我可能在某个地方犯了2个错误,所以你知道,这很艰难


如果这是一项脱机任务,您就不能受空间限制

听起来是个有趣的练习

其他人可能会有更好的答案,但如果有足够的时间,我会选择暴力路线:

使用增量哈希大小运行哈希计算,并记录每个哈希大小的冲突百分比


您可能希望使用二进制搜索来减少搜索空间。

听起来像是一个有趣的练习

其他人可能会有更好的答案,但如果有足够的时间,我会选择暴力路线:

使用增量哈希大小运行哈希计算,并记录每个哈希大小的冲突百分比

您可能希望使用二进制搜索来减少搜索空间