C#中字符串的散列冲突

时间:2014-09-27 00:52:59

标签: c# hashcode

C#中两个字符串的哈希冲突可能性有多大?我知道对于一般的对象,两个不相等的对象不能保证具有不相等的哈希码,但是当对象是字符串时,这是如何表现的。

我特别需要一个从URL字符串到唯一键的函数,但不需要任何花哨的东西,只是为了从Web缓存内容,如果某个URL已经加载则跳过下载。

修改

如果我定义这样的函数

,该怎么办?
string UniqueKey (string url) {

    var list = SplitStringInHalf (url);
    var firstHalf = list[0].GetHashCode();
    var secondHalf = list[1].GetHashCode();

    return firstHalf.ToString() + secondHalf.ToString();
}

2 个答案:

答案 0 :(得分:0)

字符串越短,概率越高,这是计算该概率的良好链接:

http://preshing.com/20110504/hash-collision-probabilities/

我认为这也可以回答你的问题:

How many random elements before MD5 produces collisions?

答案 1 :(得分:0)

对于GetHashCode(),您可以在Stack Overflow上引用此question。它会告诉你,对于小字符串,它显然更高。

一般来说,独立于你的哈希方法,只要它是合理的,对于相对较长的字符串,2个字符串之间的机会相当低,但是因为你有很多字符串,概率的诅咒会使它更高(例如当你向一个组中再添加一个人时,该组中两个人生日相同的可能性要高得多。)

作为一般规则,您不应该依赖它是唯一的,您可以使用它来区分为主键,但是如果您使用它来排序,那么您需要确保具有相同哈希码的两个字符串是不同的它们。

例如,您可以使用哈希码创建hash table,键不会是唯一的,但只有在发生碰撞时才能进行正确的比较,这样可以简化比较任务大量的元素。