所以我试图用clang(用libc ++)编译一些代码库,但我一直在寻找libstdc ++内部函数的用法。有没有人知道使用标准库或boost / etc来散列自定义字符串的一些好方法?当然我可以从中创建std :: string,但是我不使用特殊字符串来制作额外的副本。
namespace std
{
template<>
struct hash<ct::String> : public __hash_base<size_t, ct::String>
{
size_t operator()(const ct::String& __s) const noexcept
{
return std::_Hash_impl::hash(__s.begin(), __s.end() - __s.begin());
}
};
template<>
struct __is_fast_hash<hash<ct::String>> : std::false_type
{ };
}
答案 0 :(得分:1)
没有“标准”方法,因为标准库不会为std::string
以外的字符串公开散列函数。但是,如果你查看usr/include/c++/x.x.x/tr1/functional_hash.h
,你可以看到他们的字符串哈希实现(我已经清理了一点代码)
static std::size_t hash(const char* first, std::size_t length)
{
std::size_t result = static_cast<std::size_t>(2166136261UL);
for (; length > 0; --length)
{
result ^= static_cast<std::size_t>(*first++);
result *= static_cast<std::size_t>(16777619UL);
}
return result;
}
64位
std::size_t hash(const char* first, std::size_t length)
{
std::size_t result = static_cast<std::size_t>(14695981039346656037ULL);
for (; length > 0; --length)
{
result ^= static_cast<std::size_t>(*first++);
result *= static_cast<std::size_t>(1099511628211ULL);
}
return result;
}
为你的代码调整它应该很容易。