2014-09-27 63 views
0

怎么可能是二在C#中的哈希冲突?我知道对于一般的对象来说,两个不平等的对象并不保证有不相等的哈希码,但是当对象是字符串时它是如何表现的。在C#中的字符串哈希冲突

我特别需要从一个URL字符串的唯一键的功能,但不需要任何幻想,它只是缓存的东西从网络,跳过下载如果某个网址已加载。

编辑

如果我这样定义

string UniqueKey (string url) { 

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

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

这取决于对哈希算法。以低碰撞概率,如sha256。 – 2014-09-27 00:58:39

+1

@WiktorZychla,他没有提到它,但我认为他在谈论GetHashCode()。 Cristian请指定您正在使用的哈希函数。 – BlueTrin 2014-09-27 00:59:31

+0

它寻找与C#无关的问题,因为散列函数是算法构造,而不是语言特定的功能。它也是堆栈溢出的主题,因为它不涉及编码。考虑询问http://programmers.stackexchange.com/或http://crypto.stackexchange.com/ – 2014-09-27 00:59:37

回答

0

对于GetHashCode()方法,你可以参考这个question堆栈溢出。它会告诉你,对于小弦线它显然更高。一般来说,只要它是合理的,对于相对较长的字符串都是独立的,但是在两个字符串之间的机会相当低,但是由于你有很多字符串,概率的诅咒会使它更高(对于例如,当你为一个组添加一个人时,组中两个人有相同生日的机会要高得多)。

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

例如,您可以使用哈希码创建一个hash table,该键不会是唯一的,但只有在碰撞时才可以进行适当的比较,从而简化比较任务时您有大量的元素。