C++ 用C++;11

C++ 用C++;11,c++,string,c++11,hash,range,C++,String,C++11,Hash,Range,因此,我试图用clang(使用libc++)编译一些代码库,但我一直在寻找libstdc++中内部函数的用法。有人知道使用标准库或boost/etc散列自定义字符串的好方法吗?当然,我可以用它来制作std::string,但我不使用特殊的string来制作额外的副本 namespace std { template<> struct hash<ct::String> : public __hash_base<size_t, ct::String> {

因此,我试图用clang(使用libc++)编译一些代码库,但我一直在寻找libstdc++中内部函数的用法。有人知道使用标准库或boost/etc散列自定义字符串的好方法吗?当然,我可以用它来制作std::string,但我不使用特殊的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
{ };

}
名称空间std
{
模板
结构哈希:公共\uuu哈希\u基
{
size_t运算符()(常量ct::String&__s)常量noexcept
{ 
返回std::_Hash_impl::Hash(u.begin(),u.end()-u.begin());
}
};
模板
结构是快速散列:std::false\u类型
{ };
}
没有“标准”的方法来实现这一点,因为标准库不公开字符串的哈希函数,除了
std::string
。但是,如果您查看
usr/include/c++/x.x.x/tr1/functional_hash.h
,您可以看到它们的字符串哈希实现(我已经清理了一些代码)

static std::size\u t hash(const char*first,std::size\u t length)
{
标准::尺寸结果=静态铸件(2166136261UL);
对于(;长度>0;--长度)
{
结果^=静态_转换(*first++);
结果*=静态铸型(16777619UL);
}
返回结果;
}
对于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;
}
std::size\u t散列(const char*first,std::size\u t length)
{
标准:尺寸结果=静态铸件(14695981039346656037ULL);
对于(;长度>0;--长度)
{
结果^=静态_转换(*first++);
结果*=静态_型铸造(1099511628211ULL);
}
返回结果;
}
这应该很容易适应您的代码

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