diff --git a/src/strings/string-hasher-inl.h b/src/strings/string-hasher-inl.h index 4a6c7ada4b..50801de8f7 100644 --- a/src/strings/string-hasher-inl.h +++ b/src/strings/string-hasher-inl.h @@ -26,9 +26,9 @@ uint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) { } uint32_t StringHasher::GetHashCore(uint32_t running_hash) { - running_hash += (running_hash << 3); - running_hash ^= (running_hash >> 11); - running_hash += (running_hash << 15); + //running_hash += (running_hash << 3); + //running_hash ^= (running_hash >> 11); + //running_hash += (running_hash << 15); int32_t hash = static_cast(running_hash & String::HashBits::kMax); // Ensure that the hash is kZeroHash, if the computed value is 0. int32_t mask = (hash - 1) >> 31; @@ -80,7 +80,8 @@ uint32_t StringHasher::HashSequentialString(const char_t* chars_raw, int length, // Perform a regular hash computation, and additionally check // if there are non-digit characters. String::HashFieldType type = String::HashFieldType::kIntegerIndex; - uint32_t running_hash = static_cast(seed); + + uint32_t running_hash = 0x811c9dc5u; uint64_t index_big = 0; const uchar* end = &chars[length]; while (chars != end) { @@ -88,10 +89,14 @@ uint32_t StringHasher::HashSequentialString(const char_t* chars_raw, int length, !TryAddIntegerIndexChar(&index_big, *chars)) { type = String::HashFieldType::kHash; } - running_hash = AddCharacterCore(running_hash, *chars++); + + uint16_t a = uint16_t(*chars++); // Latin1 -> UTF16; or UTF16 -> UTF16 + running_hash ^= uint32_t(a & 0xFF) * 0x01000193u; + running_hash ^= uint32_t((a >> 8) & 0xFF) * 0x01000193u; } uint32_t hash = String::CreateHashFieldValue(GetHashCore(running_hash), type); + if (Name::ContainsCachedArrayIndex(hash)) { // The hash accidentally looks like a cached index. Fix that by // setting a bit that looks like a longer-than-cacheable string @@ -112,10 +117,12 @@ uint32_t StringHasher::HashSequentialString(const char_t* chars_raw, int length, } // Non-index hash. - uint32_t running_hash = static_cast(seed); + uint32_t running_hash = 0x811c9dc5u; const uchar* end = &chars[length]; while (chars != end) { - running_hash = AddCharacterCore(running_hash, *chars++); + uint16_t a = uint16_t(*chars++); // Latin1 -> UTF16; or UTF16 -> UTF16 + running_hash ^= uint32_t(a & 0xFF) * 0x01000193u; + running_hash ^= uint32_t((a >> 8) & 0xFF) * 0x01000193u; } return String::CreateHashFieldValue(GetHashCore(running_hash),