51 lines
1.2 KiB
C++
51 lines
1.2 KiB
C++
|
#include "stdinc.h"
|
||
|
#include "debmacro.h"
|
||
|
#include "util.h"
|
||
|
#include "fusiontrace.h"
|
||
|
|
||
|
BOOL
|
||
|
FusionpHashUnicodeString(
|
||
|
PCWSTR String,
|
||
|
SIZE_T cch,
|
||
|
PULONG HashValue,
|
||
|
bool fCaseInsensitive
|
||
|
)
|
||
|
{
|
||
|
BOOL fSuccess = FALSE;
|
||
|
FN_TRACE_WIN32(fSuccess);
|
||
|
ULONG TmpHashValue = 0;
|
||
|
|
||
|
if (HashValue != NULL)
|
||
|
*HashValue = 0;
|
||
|
|
||
|
PARAMETER_CHECK(HashValue != NULL);
|
||
|
|
||
|
//
|
||
|
// Note that if you change this implementation, you have to have the implementation inside
|
||
|
// ntdll change to match it. Since that's hard and will affect everyone else in the world,
|
||
|
// DON'T CHANGE THIS ALGORITHM NO MATTER HOW GOOD OF AN IDEA IT SEEMS TO BE! This isn't the
|
||
|
// most perfect hashing algorithm, but its stability is critical to being able to match
|
||
|
// previously persisted hash values.
|
||
|
//
|
||
|
|
||
|
if (fCaseInsensitive)
|
||
|
{
|
||
|
while (cch-- != 0)
|
||
|
{
|
||
|
WCHAR Char = *String++;
|
||
|
TmpHashValue = (TmpHashValue * 65599) + ::FusionpRtlUpcaseUnicodeChar(Char);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
while (cch-- != 0)
|
||
|
TmpHashValue = (TmpHashValue * 65599) + *String++;
|
||
|
}
|
||
|
|
||
|
*HashValue = TmpHashValue;
|
||
|
fSuccess = TRUE;
|
||
|
Exit:
|
||
|
return fSuccess;
|
||
|
}
|
||
|
|