C 中常见类型的哈希码

GetHashCode() 方法为 System 名称空间中的内置和常见 C#类型生成的哈希码如下所示。

布尔

如果值为 true,则为 1,否则为 0。

字节UInt16Int32UInt32

值(如果需要,则转换为 Int32)。

为 SByte

((int)m_value ^ (int)m_value << 8);

Char

(int)m_value ^ ((int)m_value << 16);

INT16

((int)((ushort)m_value) ^ (((int)m_value) << 16));

Int64

64 位数的低 32 位和高 32 位之间的 Xor

(unchecked((int)((long)m_value)) ^ (int)(m_value >> 32));

UInt64DateTimeTimeSpan

((int)m_value) ^ (int)(m_value >> 32);

十进制

((((int *)&dbl)[0]) & 0xFFFFFFF0) ^ ((int *)&dbl)[1];

宾语

RuntimeHelpers.GetHashCode(this);

默认实现是使用同步块索引

字符串

散列码计算取决于平台类型(Win32 或 Win64),使用随机字符串散列,调试/释放模式的功能。在 Win64 平台的情况下:

int hash1 = 5381;
int hash2 = hash1;
int c;
char *s = src;
while ((c = s[0]) != 0) {
    hash1 = ((hash1 << 5) + hash1) ^ c;
    c = s[1];
    if (c == 0)
        break;
    hash2 = ((hash2 << 5) + hash2) ^ c;
    s += 2;
}
return hash1 + (hash2 * 1566083941);

值类型

第一个非静态字段是查找并获取它的哈希码。如果类型没有非静态字段,则返回该类型的哈希码。无法获取静态成员的哈希码,因为如果该成员与原始类型的类型相同,则计算结束于无限循环中。

可空<T>

return hasValue ? value.GetHashCode() : 0;

排列

int ret = 0;
for (int i = (Length >= 8 ? Length - 8 : 0); i < Length; i++) 
{
    ret = ((ret << 5) + ret) ^ comparer.GetHashCode(GetValue(i));
}

参考