使用C ++ 11散列自己的String类型

时间:2015-10-29 18:15:45

标签: c++ string c++11 hash range

所以我试图用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
{ };

}

1 个答案:

答案 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;
}

为你的代码调整它应该很容易。