3

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

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

4

3 回答 3

5

没有办法明确回答这个问题。String.GetHashCode()的行为被记录为未定义,可能会在框架版本之间发生变化,并且在 32 位和 64 位系统之间会有所不同。

如果您选择了其他值,则可能会发生碰撞。零将是一个非常合理的默认值。

如果Nullable.GetHashCode()存储空值,则返回 0,因此返回零的哈希码有一些先例。

于 2012-06-08T05:46:21.123 回答
2

GetHashCode()只要求哈希码一致。它不需要是唯一的。所以零是一个有效但非常幼稚的哈希值:)

显然,这将导致哈希表中的许多冲突。

至于字符串哈希码,我想在某些情况下是可能的。

于 2012-06-08T05:43:05.313 回答
1

这是有风险的,空字符串可能会被强制转换为空字符串。例如:

        string nullstr = null;
        string notnull = nullstr + nullstr;

可能有点古怪,但是当它发生时,您将有一个很好的调试时间。简单的解决方案是使用 string.Empty.GetHashCode(),不要求哈希码是唯一的。

于 2012-06-08T11:19:43.243 回答