예제 #1
0
파일: hash.cpp 프로젝트: DerPapst/hhvm
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);
      }
    }
  }
}
예제 #2
0
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;
}
예제 #3
0
파일: hash.cpp 프로젝트: DerPapst/hhvm
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));
}
예제 #4
0
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;
}