blob: 10d998df6af1b92f46a2e221ed184ee91c9971ac [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
/*
* IMPORTANT:
* This file does not compile stand alone. It was required so that
* the same code could be built into a utility program comphash.exe as well
* as the scripting dll's. This file is included in core\comphash.cpp
* to be used by comphash.exe. It is included in core\scrutil.cpp where to
* be used by jscript.dll and vbscript.dll.
*
* comphash.exe is a utility used in the build to generate a source code file
* containing a table of hash values associated with strings needed by
* jscript and vbscript. It is highly desirable to have a single definition
* of the hash function so things don't go out of sync.
*/
ULONG CaseSensitiveComputeHash(LPCOLESTR prgch, LPCOLESTR end)
{
ULONG luHash = 0;
while (prgch < end)
{
luHash = 17 * luHash + *(char16 *)prgch++;
}
return luHash;
}
ULONG CaseSensitiveComputeHash(LPCUTF8 prgch, LPCUTF8 end)
{
utf8::DecodeOptions options = utf8::doAllowThreeByteSurrogates;
ULONG luHash = 0;
while (prgch < end)
{
luHash = 17 * luHash + utf8::Decode(prgch, end, options);
}
return luHash;
}
ULONG CaseSensitiveComputeHash(char const * prgch, char const * end)
{
ULONG luHash = 0;
while (prgch < end)
{
Assert(utf8::IsStartByte(*prgch) && !utf8::IsLeadByte(*prgch));
luHash = 17 * luHash + *prgch++;
}
return luHash;
}
ULONG CaseInsensitiveComputeHash(LPCOLESTR posz)
{
ULONG luHash = 0;
char16 ch;
while (0 != (ch = *(char16 *)posz++))
{
if (ch <= 'Z' && ch >= 'A')
ch += 'a' - 'A';
luHash = 17 * luHash + ch;
}
return luHash;
}