in Arriba/Arriba/Structures/Value.cs [732:814]
public override int GetHashCode()
{
// Return zero for null
if (_value == null) return 0;
// Return previous value if determined
if (_cachedHashCode != 0) return _cachedHashCode;
// If ByteBlock, hash directly
if (_value is ByteBlock)
{
_cachedHashCode = ((ByteBlock)_value).GetHashCode();
return _cachedHashCode;
}
if (_value is ValueTypeReference<int>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((long)(_value as ValueTypeReference<int>).Value, 0));
}
else if (_value is ValueTypeReference<uint>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((ulong)(_value as ValueTypeReference<uint>).Value, 0));
}
else if (_value is ValueTypeReference<long>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((_value as ValueTypeReference<long>).Value, 0));
}
else if (_value is ValueTypeReference<double>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((_value as ValueTypeReference<double>).Value, 0));
}
else if (_value is ValueTypeReference<ulong>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((_value as ValueTypeReference<ulong>).Value, 0));
}
else if (_value is ValueTypeReference<DateTime>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((_value as ValueTypeReference<DateTime>).Value, 0));
}
else if (_value is ValueTypeReference<TimeSpan>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((_value as ValueTypeReference<TimeSpan>).Value, 0));
}
else if (_value is ValueTypeReference<Guid>)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((_value as ValueTypeReference<Guid>).Value, 0));
}
else
{
// Determine ideal value to hash
object idealTypeValue = DetermineIdealTypeValue();
if (idealTypeValue is long)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((long)idealTypeValue, 0));
}
else if (idealTypeValue is double)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((double)idealTypeValue, 0));
}
else if (idealTypeValue is ulong)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((ulong)idealTypeValue, 0));
}
else if (idealTypeValue is DateTime)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((DateTime)idealTypeValue, 0));
}
else if (idealTypeValue is TimeSpan)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((TimeSpan)idealTypeValue, 0));
}
else if (idealTypeValue is Guid)
{
_cachedHashCode = unchecked((int)Hashing.MurmurHash3((Guid)idealTypeValue, 0));
}
else
{
_cachedHashCode = ToByteBlock().GetHashCode();
}
}
return _cachedHashCode;
}