Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对字符串调用GetHashCode()时获得重复值的概率_C#_Hashcode_Hash Collision_Hash Code Uniqueness - Fatal编程技术网

C# 对字符串调用GetHashCode()时获得重复值的概率

C# 对字符串调用GetHashCode()时获得重复值的概率,c#,hashcode,hash-collision,hash-code-uniqueness,C#,Hashcode,Hash Collision,Hash Code Uniqueness,我想知道在string实例上调用GetHashCode()方法时获得重复值的概率。例如,blair和brainless在x86机器上拥有相同的hashcode(1758039503)。我认为可以说的只是“小,但有限,绝对不是零”——换句话说,你不能依赖GetHashCode()为两个不同的实例返回唯一的值 在我看来,当你想快速判断两个实例是否不同,而不是它们是否相同时,最好使用哈希代码 换句话说,如果两个对象具有不同的哈希代码,那么您知道它们是不同的,并且不需要进行(可能代价高昂的)更深入的比较

我想知道在
string
实例上调用
GetHashCode()
方法时获得重复值的概率。例如,
blair
brainless
在x86机器上拥有相同的hashcode(1758039503)。

我认为可以说的只是“小,但有限,绝对不是零”——换句话说,你不能依赖
GetHashCode()
为两个不同的实例返回唯一的值

在我看来,当你想快速判断两个实例是否不同,而不是它们是否相同时,最好使用哈希代码

换句话说,如果两个对象具有不同的哈希代码,那么您知道它们是不同的,并且不需要进行(可能代价高昂的)更深入的比较


但是,如果两个对象的哈希代码相同,则必须继续比较对象本身,以查看它们是否实际相同。

小-如果您谈论的是任意两个不相等的字符串发生冲突的可能性。(当然,这取决于字符串的“任意性”——不同的上下文将使用不同的字符串。)

大-如果您谈论的是在一个任意字符串的大池中至少发生一次冲突的可能性。小的个体概率无法与大的个体相匹敌

这就是你需要知道的全部。在某些情况下,肯定会发生冲突,并且必须给出只有232个可能的哈希代码,并且超过那么多的字符串-因此证明至少一个哈希代码必须有多个生成它的字符串。但是,您应该相信散列的设计是非常合理的

您可以将它作为缩小特定字符串可能匹配范围的一种非常好的方法。这将是一组不寻常的自然出现的字符串,它们产生了大量的冲突-即使有一些冲突,显然如果你能将候选搜索集从50K缩小到少于10个字符串,这将是一个巨大的胜利。但是不能依赖它作为任何字符串的唯一值


请注意,.NET 4中使用的算法在x86和x64之间有所不同,因此示例可能在这两种平台上都无效。

两个随机选择的字符串之间发生冲突的概率是
1/2^(哈希代码中的位)
,如果哈希是完美的,这不太可能或不可能。

大。

(对不起,乔恩!)

短字符串之间发生哈希冲突的概率非常大。如果一组仅由一万个不同的短字符串组成,则该组中至少有一个冲突的概率约为1%。如果有八万条字符串,则至少发生一次碰撞的概率超过50%

有关显示集合大小和碰撞概率之间关系的图表,请参阅我关于该主题的文章:


以防您的问题是一组字符串发生碰撞的概率是多少

对于n个可用插槽和m个占用项目:
问题。第一次插入时没有碰撞的值为1
问题。第二次插入时没有碰撞的概率为(n-1)/n
问题。第三次插入时没有碰撞的概率为(n-2)/n
问题。第m次插入时没有碰撞的概率为(n-(m-1))/n

m次插入后无碰撞的概率是上述值的乘积:(n-1)/((n-m)!*n^(m-1))

简化为(n选择k)/(n^m)


每个人都是对的,你不能假设0次碰撞,所以说概率“低”可能是真的,但不允许你假设没有碰撞。如果你在看一个哈希表,我认为标准是当你的哈希表大约满了2/3秒时,你开始遇到严重冲突的问题

我在一个466k英语单词的数据库上运行了一个测试,得到了48个与
string.GetHashCode()
的冲突。结果稍微好一点。更多结果如下:

您想避免碰撞吗?这相当罕见,但当然也不是不可能。是的,我想知道发生碰撞的概率。这个问题没有明确说明。首先,有无限多个可能的字符串。您需要说明在所有可能字符串的空间中使用的概率分布。第二,你没有说你感兴趣的集合的大小。假设您有n个字符串。您是否对这n个字符串与特定字符串的哈希冲突概率感兴趣,或者对集合中的任何字符串是否与其他字符串冲突感兴趣?这些是非常不同的分析。你是对的,我对任何一对字符串之间可能发生碰撞感兴趣。但是考虑到现在的答案,我知道我不能依赖GetHashCode()为给定字符串生成唯一值。哦,绝对不能依赖唯一性。只有40亿个可能的散列值,但显然有超过40亿个可能的字符串;字符串“0”、“1”和。。。仅“5000000000”就有50亿个字符串。你不可能把无限多的鸽子放进四十亿个鸽子洞,而这些鸽子洞中没有一个有不止一只鸽子!我尝试了我在x64机器上提供的示例,哈希值不同,我将编辑问题,谢谢你指出这一点。这样更好。面对不精确的规格,围栏坐在那里;)@ShuggyCoUk:我试着跨过栅栏而不是坐在上面:)@Jon,小心。如果你弄错了,你可能会有一个拆分…headache在字符串上下文中定义“random”。我认为在现实生活中,少于10个字符的字符串比超过1000万个字符的字符串出现的频率更高。@JonSkeet,很公平,我同意