forked from nique_372/SimPHash
94 lines
2.8 KiB
MQL5
94 lines
2.8 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| FNV1a64.mqh |
| |||
//| Copyright 2026, Niquel Mendoza. |
| |||
//| https://www.mql5.com/ |
| |||
//+------------------------------------------------------------------+
| |||
#property copyright "Copyright 2026, Niquel Mendoza."
| |||
#property link "https://www.mql5.com/"
| |||
#property strict
| |||
| |||
#ifndef SIMPHASH_SRC_HASH_STR_FNV1A64_MQH
| |||
#define SIMPHASH_SRC_HASH_STR_FNV1A64_MQH
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
#include "..\\Def.mqh"
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
namespace TSN
| |||
{
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
class CHashFnv1A64 : public IHashGenerator
| |||
{
| |||
private:
| |||
ulong m_basis;
| |||
ulong m_prime_offset;
| |||
| |||
public:
| |||
CHashFnv1A64(void) {}
| |||
~CHashFnv1A64(void) {}
| |||
| |||
| |||
//---
| |||
bool Init(CYmlNode& node) override final
| |||
{
| |||
//---
| |||
CYmlNode basis = node["basis"];
| |||
if((basis.GetFlag()&TSN_YAML_VTYPE_ALL_STRING) != 0) // def
| |||
{
| |||
m_basis = FNV_OFFSET_BASIS;
| |||
}
| |||
else
| |||
{
| |||
m_basis = ulong(basis.ToInt(FNV_OFFSET_BASIS));
| |||
}
| |||
| |||
//---
| |||
CYmlNode prime = node["prime"];
| |||
if((prime.GetFlag()&TSN_YAML_VTYPE_ALL_STRING) != 0)
| |||
{
| |||
m_prime_offset = FNV_PRIME;
| |||
}
| |||
else
| |||
{
| |||
m_prime_offset = ulong(prime.ToInt(FNV_PRIME));
| |||
}
| |||
| |||
//---
| |||
return true;
| |||
}
| |||
| |||
//---
| |||
ulong Hash(const string& key) override final
| |||
{
| |||
const int len = StringLen(key);
| |||
ulong hash = m_basis;
| |||
FNV1a_64_AsM_Str(key, len, hash, m_prime_offset)
| |||
return hash;
| |||
}
| |||
| |||
//---
| |||
void AddIncludes(string& data) override final
| |||
{
| |||
data += "#include <TSN/Tables/AllHashes.mqh>\r\n";
| |||
}
| |||
| |||
//---
| |||
void BuildString(string& data) override final
| |||
{
| |||
data += "//---\r\n";
| |||
data += " const int len = StringLen(key);\r\n";
| |||
data += " ulong key_hash = " + string(m_basis) + "ULL;\r\n";
| |||
data += " FNV1a_64_AsM_Str(key, len, key_hash, " + string(m_prime_offset) + "ULL)\r\n";
| |||
data += "\r\n";
| |||
}
| |||
};
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
#endif // SIMPHASH_SRC_HASH_STR_FNV1A64_MQH
|