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