Algorithms Hash Functions suggest change

Hash codes for common types in C

The hash codes produced by GetHashCode() method for built-in and common C# types from the System namespace are shown below.

Boolean

1 if value is true, 0 otherwise.

Byte, UInt16, Int32, UInt32, Single

Value (if necessary casted to 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, Double

Xor between lower and upper 32 bits of 64 bit number

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

UInt64, DateTime, TimeSpan

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

Decimal

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

Object

RuntimeHelpers.GetHashCode(this);

The default implementation is used sync block index.

String

Hash code computation depends on the platform type (Win32 or Win64), feature of using randomized string hashing, Debug / Release mode. In case of Win64 platform:

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);

ValueType

The first non-static field is look for and get it’s hashcode. If the type has no non-static fields, the hashcode of the type returns. The hashcode of a static member can’t be taken because if that member is of the same type as the original type, the calculating ends up in an infinite loop.

Nullable<T>

return hasValue ? value.GetHashCode() : 0;

Array

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

References

Feedback about page:

Feedback:
Optional: your email if you want me to get back to you:



Table Of Contents