vxug-VXAPI/VX-API/HashStringMurmur.cpp

117 lines
1.7 KiB
C++

#include "Win32Helper.h"
INT32 HashStringMurmurW(_In_ LPCWSTR String)
{
INT Length = (INT)StringLengthW(String);
UINT32 hash = 0;
PUINT32 Tmp;
SIZE_T Idx;
UINT32 Cnt;
if (Length > 3)
{
Idx = Length >> 2;
Tmp = (PUINT32)String;
do {
Cnt = *Tmp++;
Cnt *= 0xcc9e2d51;
Cnt = (Cnt << 15) | (Cnt >> 17);
Cnt *= 0x1b873593;
hash ^= Cnt;
hash = (hash << 13) | (hash >> 19);
hash = (hash * 5) + 0xe6546b64;
} while (--Idx);
String = (PWCHAR)Tmp;
}
if (Length & 3)
{
Idx = Length & 3;
Cnt = 0;
String = &String[Idx - 1];
do {
Cnt <<= 8;
Cnt |= *String--;
} while (--Idx);
Cnt *= 0xcc9e2d51;
Cnt = (Cnt << 15) | (Cnt >> 17);
Cnt *= 0x1b873593;
hash ^= Cnt;
}
hash ^= Length;
hash ^= hash >> 16;
hash *= 0x85ebca6b;
hash ^= hash >> 13;
hash *= 0xc2b2ae35;
hash ^= hash >> 16;
return hash;
}
INT32 HashStringMurmurA(_In_ LPCSTR String)
{
INT Length = (INT)StringLengthA(String);
UINT32 hash = 0;
PUINT32 Tmp;
SIZE_T Idx;
UINT32 Cnt;
if (Length > 3)
{
Idx = Length >> 2;
Tmp = (PUINT32)String;
do {
Cnt = *Tmp++;
Cnt *= 0xcc9e2d51;
Cnt = (Cnt << 15) | (Cnt >> 17);
Cnt *= 0x1b873593;
hash ^= Cnt;
hash = (hash << 13) | (hash >> 19);
hash = (hash * 5) + 0xe6546b64;
} while (--Idx);
String = (PCHAR)Tmp;
}
if (Length & 3)
{
Idx = Length & 3;
Cnt = 0;
String = &String[Idx - 1];
do {
Cnt <<= 8;
Cnt |= *String--;
} while (--Idx);
Cnt *= 0xcc9e2d51;
Cnt = (Cnt << 15) | (Cnt >> 17);
Cnt *= 0x1b873593;
hash ^= Cnt;
}
hash ^= Length;
hash ^= hash >> 16;
hash *= 0x85ebca6b;
hash ^= hash >> 13;
hash *= 0xc2b2ae35;
hash ^= hash >> 16;
return hash;
}