使用GetHashCode()
方法获取字符串的哈希码时,它是否有可能返回零或者使用的算法是否保证?
我问的原因是我有一个用例,我需要为空字符串发明一个哈希,而我正在考虑使用零而不是散列一些常量字符串。如果我这样做,我有可能发生碰撞(除非碰撞总是可能的事实)
答案 0 :(得分:5)
没有办法明确回答这个问题。 String.GetHashCode()的行为被记录为未定义,并且可能在框架版本之间发生变化,并且在32位和64位系统之间不同。
如果您选择其他值,则可能会发生碰撞。零将是一个非常合理的默认值。
如果Nullable.GetHashCode()存储空值,则{{3}}返回0,因此返回哈希代码为零有一些先例。
答案 1 :(得分:2)
GetHashCode()
只要求哈希码保持一致。它不需要是唯一的。所以零是有效但非常天真的哈希值:)
显然,这会在哈希表中引起很多冲突。
至于字符串哈希码,我想在某些情况下是可能的。
答案 2 :(得分:1)
这是有风险的,空字符串可以被强制转换为空字符串。例如:
string nullstr = null;
string notnull = nullstr + nullstr;
或许有点古怪,但是当它发生时你会有一个helluvatime调试问题。简单的解决方案是使用string.Empty.GetHashCode(),不要求散列码是唯一的。