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); } } } }
std::string ParserBase::newClosureName( const std::string &namespaceName, const std::string &className, const std::string &funcName) { // Closure names must be globally unique. The easiest way to do // this is include a hash of the filename. int64_t hash = hash_string_cs(m_fileName, strlen(m_fileName)); std::string name = "Closure$"; if (!className.empty()) { name += className + "::"; } else if (!namespaceName.empty()) { // If className is present, it already includes the namespace name += namespaceName + "\\"; } name += funcName; int id = ++m_seenClosures[name]; folly::format(&name, ";{}", hash); if (id > 1) { // we've seen the same name before, uniquify name = name + '#' + std::to_string(id); } return name; }
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)); }
std::string ParserBase::getAnonFuncName(AnonFuncKind kind) { int64_t h = hash_string_cs(m_fileName, strlen(m_fileName)); int closureId; { Lock lock(s_mutex); int &id = s_closureIds[h]; closureId = ++id; } string ret; ret += GetAnonPrefix(kind); ret += boost::lexical_cast<string>(h); ret += "_"; ret += boost::lexical_cast<string>(closureId); return ret; }