mirror of https://github.com/vxunderground/VX-API
113 lines
1.9 KiB
C++
113 lines
1.9 KiB
C++
#include "Win32Helper.h"
|
|
|
|
UINT32 HashStringSuperFastHashA(_In_ LPCSTR String)
|
|
{
|
|
INT Length = (INT)StringLengthA(String);
|
|
UINT32 Hash = Length;
|
|
INT Tmp = 0;
|
|
|
|
INT Rem = Length & 3;
|
|
Length >>= 2;
|
|
|
|
for (; Length > 0; Length--)
|
|
{
|
|
Hash += Get16Bits(String);
|
|
Tmp = (Get16Bits(String + 2) << 11) ^ Hash;
|
|
Hash = (Hash << 16) ^ Tmp;
|
|
#pragma warning( push )
|
|
#pragma warning( disable : 6305)
|
|
String += 2 * sizeof(UINT16);
|
|
#pragma warning( pop )
|
|
Hash += Hash >> 11;
|
|
}
|
|
|
|
switch (Rem)
|
|
{
|
|
case 3:
|
|
{
|
|
Hash += Get16Bits(String);
|
|
Hash ^= Hash << 16;
|
|
Hash ^= ((UCHAR)String[sizeof(UINT16)]) << 18;
|
|
Hash += Hash >> 11;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
Hash += Get16Bits(String);
|
|
Hash ^= Hash << 11;
|
|
Hash ^= Hash >> 17;
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
Hash += (UCHAR)*String;
|
|
Hash ^= Hash << 10;
|
|
Hash += Hash >> 1;
|
|
}
|
|
}
|
|
|
|
Hash ^= Hash << 3;
|
|
Hash += Hash >> 5;
|
|
Hash ^= Hash << 4;
|
|
Hash += Hash >> 17;
|
|
Hash ^= Hash << 25;
|
|
Hash += Hash >> 6;
|
|
|
|
return Hash;
|
|
}
|
|
|
|
UINT32 HashStringSuperFastHashW(_In_ LPCWSTR String)
|
|
{
|
|
INT Length = (INT)StringLengthW(String);
|
|
UINT32 Hash = Length;
|
|
INT Tmp = 0;
|
|
|
|
INT Rem = Length & 3;
|
|
Length >>= 2;
|
|
|
|
for (; Length > 0; Length--)
|
|
{
|
|
Hash += Get16Bits(String);
|
|
Tmp = (Get16Bits(String + 2) << 11) ^ Hash;
|
|
Hash = (Hash << 16) ^ Tmp;
|
|
#pragma warning( push )
|
|
#pragma warning( disable : 6305)
|
|
String += 2 * sizeof(UINT16);
|
|
#pragma warning( pop )
|
|
Hash += Hash >> 11;
|
|
}
|
|
|
|
switch (Rem)
|
|
{
|
|
case 3:
|
|
{
|
|
Hash += Get16Bits(String);
|
|
Hash ^= Hash << 16;
|
|
Hash ^= ((UCHAR)String[sizeof(UINT16)]) << 18;
|
|
Hash += Hash >> 11;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
Hash += Get16Bits(String);
|
|
Hash ^= Hash << 11;
|
|
Hash ^= Hash >> 17;
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
Hash += (UCHAR)*String;
|
|
Hash ^= Hash << 10;
|
|
Hash += Hash >> 1;
|
|
}
|
|
}
|
|
|
|
Hash ^= Hash << 3;
|
|
Hash += Hash >> 5;
|
|
Hash ^= Hash << 4;
|
|
Hash += Hash >> 17;
|
|
Hash ^= Hash << 25;
|
|
Hash += Hash >> 6;
|
|
|
|
return Hash;
|
|
} |