字符串的GetHashCode()方法可以返回零吗?

时间:2012-06-08 05:32:35

标签: .net hashcode

使用GetHashCode()方法获取字符串的哈希码时,它是否有可能返回零或者使用的算法是否保证?

我问的原因是我有一个用例,我需要为空字符串发明一个哈希,而我正在考虑使用零而不是散列一些常量字符串。如果我这样做,我有可能发生碰撞(除非碰撞总是可能的事实)

3 个答案:

答案 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(),不要求散列码是唯一的。