StringHashFunctions.h [plain text]
#ifndef WTF_StringHashFunctions_h
#define WTF_StringHashFunctions_h
#include <wtf/unicode/Unicode.h>
namespace WTF {
static const unsigned stringHashingStartValue = 0x9e3779b9U;
inline unsigned stringHash(const UChar* data, unsigned length)
{
unsigned hash = WTF::stringHashingStartValue;
unsigned rem = length & 1;
length >>= 1;
for (; length > 0; length--) {
hash += data[0];
unsigned tmp = (data[1] << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2;
hash += hash >> 11;
}
if (rem) {
hash += data[0];
hash ^= hash << 11;
hash += hash >> 17;
}
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 2;
hash += hash >> 15;
hash ^= hash << 10;
hash &= 0x7fffffff;
if (hash == 0)
hash = 0x40000000;
return hash;
}
inline unsigned stringHash(const char* data, unsigned length)
{
unsigned hash = WTF::stringHashingStartValue;
unsigned rem = length & 1;
length >>= 1;
for (; length > 0; length--) {
hash += static_cast<unsigned char>(data[0]);
unsigned tmp = (static_cast<unsigned char>(data[1]) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2;
hash += hash >> 11;
}
if (rem) {
hash += static_cast<unsigned char>(data[0]);
hash ^= hash << 11;
hash += hash >> 17;
}
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 2;
hash += hash >> 15;
hash ^= hash << 10;
hash &= 0x7fffffff;
if (hash == 0)
hash = 0x40000000;
return hash;
}
inline unsigned stringHash(const char* data)
{
unsigned hash = WTF::stringHashingStartValue;
for (;;) {
unsigned char b0 = data[0];
if (!b0)
break;
unsigned char b1 = data[1];
if (!b1) {
hash += b0;
hash ^= hash << 11;
hash += hash >> 17;
break;
}
hash += b0;
unsigned tmp = (b1 << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2;
hash += hash >> 11;
}
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 2;
hash += hash >> 15;
hash ^= hash << 10;
hash &= 0x7fffffff;
if (hash == 0)
hash = 0x40000000;
return hash;
}
}
#endif // WTF_StringHashFunctions_h