public override int GetHashCode()

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