TEST(HashTest, SSE42) { if (IsHWHashSupported()) { { char* stra = "abcdeFGHHHh"; char* strb = "ABcdEfghhHH"; uint32_t len = std::strlen(stra); auto const ihasha = hash_string_i(stra, len); auto const ihashb = hash_string_i(strb, len); EXPECT_EQ(ihasha, ihashb); EXPECT_EQ(ihasha, hash_string_i_unsafe(stra, len)); EXPECT_EQ(hash_string_cs(stra, len), hash_string_cs_unsafe(stra, len)); } { char buffer[256]; char* pattern = "abCDefGH123"; auto const len = std::strlen(pattern); auto const h = hash_string_i(pattern, len); for (char* start = buffer; start + len + 8 < buffer + sizeof(buffer); start += len) { std::memcpy(start, pattern, len); // Aligned version should work as long as we don't read beyond end of // the buffer. auto const aligned_hash = hash_string_i_unsafe(start, len); auto const unaligned_hash = hash_string_i(start, len); EXPECT_EQ(h, aligned_hash); EXPECT_EQ(h, unaligned_hash); } } } }
NEVER_INLINE strhash_t StringData::hashHelper() const { assert(!isShared()); strhash_t h = hash_string_i_unsafe(m_data, m_len); assert(h >= 0); m_hash |= h; return h; }
TEST(HashTest, Case) { char* stra = "abcdeFGHHHh"; char* strb = "ABcdEfghhHH"; uint32_t len = std::strlen(stra); auto const ihasha = hash_string_i(stra, len); auto const ihashb = hash_string_i(strb, len); EXPECT_EQ(ihasha, ihashb); EXPECT_EQ(ihasha, hash_string_i_unsafe(stra, len)); EXPECT_EQ(hash_string_cs(stra, len), hash_string_cs_unsafe(stra, len)); }
TEST(HashTest, Alignment) { char buffer[256]; char* pattern = "abCDefGH123"; auto const len = std::strlen(pattern); auto const h = hash_string_i(pattern, len); for (char* start = buffer; start + len + 8 < buffer + sizeof(buffer); start += len) { std::memcpy(start, pattern, len); // Aligned version should work as long as we don't read beyond end of the // buffer. auto const aligned_hash = hash_string_i_unsafe(start, len); auto const unaligned_hash = hash_string_i(start, len); EXPECT_EQ(h, aligned_hash); EXPECT_EQ(h, unaligned_hash); } }
size_t operator()(const String& s) const { return hash_string_i_unsafe(s.data(), s.size()); }