176 lines
6.9 KiB
MQL5
176 lines
6.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| HashFunction.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
//+------------------------------------------------------------------+
| |||
//| Unioun BitInterpreter. |
| |||
//| Usage: Provides the ability to interpret the same bit sequence in|
| |||
//| different types. |
| |||
//+------------------------------------------------------------------+
| |||
union BitInterpreter
| |||
{
| |||
bool bool_value;
| |||
char char_value;
| |||
uchar uchar_value;
| |||
short short_value;
| |||
ushort ushort_value;
| |||
color color_value;
| |||
int int_value;
| |||
uint uint_value;
| |||
datetime datetime_value;
| |||
long long_value;
| |||
ulong ulong_value;
| |||
float float_value;
| |||
double double_value;
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for boolean. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const bool value)
| |||
{
| |||
return((value)?true:false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for character. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const char value)
| |||
{
| |||
return((int)value | ((int)value << 16));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for unsigned character. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const uchar value)
| |||
{
| |||
return((int)value | ((int)value << 16));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for short. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const short value)
| |||
{
| |||
return(((int)((ushort)value) | (((int)value) << 16)));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for unsigned short. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const ushort value)
| |||
{
| |||
return((int)value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for color. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const color value)
| |||
{
| |||
return((int)value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for integer. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const int value)
| |||
{
| |||
return(value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for unsigned integer. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const uint value)
| |||
{
| |||
return((int)value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for datetime. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const datetime value)
| |||
{
| |||
long ticks=(long)value;
| |||
return(((int)ticks) ^ (int)(ticks >> 32));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for long. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const long value)
| |||
{
| |||
return(((int)((long)value)) ^ (int)(value >> 32));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for unsigned long. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const ulong value)
| |||
{
| |||
return(((int)value) ^ (int)(value >> 32));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for float. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const float value)
| |||
{
| |||
if(value==0)
| |||
{
| |||
//--- ensure that 0 and -0 have the same hash code
| |||
return(0);
| |||
}
| |||
BitInterpreter convert;
| |||
convert.float_value=value;
| |||
return(convert.int_value);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for string. |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const double value)
| |||
{
| |||
if(value==0)
| |||
{
| |||
//--- ensure that 0 and -0 have the same hash code
| |||
return(0);
| |||
}
| |||
BitInterpreter convert;
| |||
convert.double_value=value;
| |||
long lvalue=convert.long_value;
| |||
return(((int)lvalue) ^ ((int)(lvalue >> 32)));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for string. |
| |||
//| The hashcode for a string is computed as: |
| |||
//| |
| |||
//| s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] |
| |||
//| |
| |||
//| using int arithmetic, where s[i] is the ith character of the |
| |||
//| string, n is the length of the string, and ^ indicates |
| |||
//| exponentiation. (The hash value of the empty string is zero.) |
| |||
//+------------------------------------------------------------------+
| |||
int GetHashCode(const string value)
| |||
{
| |||
int len=StringLen(value);
| |||
int hash=0;
| |||
//--- check length of string
| |||
if(len>0)
| |||
{
| |||
//--- calculate a hash as a fucntion of each char
| |||
for(int i=0; i<len; i++)
| |||
hash=31*hash+value[i];
| |||
}
| |||
return(hash);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Returns a hashcode for custom object. |
| |||
//+------------------------------------------------------------------+
| |||
template<typename T>
| |||
int GetHashCode(T value)
| |||
{
| |||
//--- try to convert to equality comparable object
| |||
IEqualityComparable<T>*equtable=dynamic_cast<IEqualityComparable<T>*>(value);
| |||
if(equtable)
| |||
{
| |||
//--- calculate hash by specied method
| |||
return equtable.HashCode();
| |||
}
| |||
else
| |||
{
| |||
//--- calculate hash from name of object
| |||
return GetHashCode(typename(value));
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
|