首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++0x中组合哈希值?

如何在C++0x中组合哈希值?
EN

Stack Overflow用户
提问于 2010-04-07 15:28:38
回答 7查看 42.9K关注 0票数 94

C++0x增加了

..。

我找不到

函数,如

助推

..。要实现这样的东西,最干净的方法是什么?也许,使用C++0x

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-04-08 03:18:42

好吧,就像助推器的人那样做:

代码语言:javascript
复制
template 
inline void hash_combine(std::size_t& seed, const T& v)
{
    std::hash hasher;
    seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
票数 106
EN

Stack Overflow用户

发布于 2016-07-01 16:46:25

我将在这里分享它,因为它对其他寻找此解决方案的人很有用:

@KarlvonMoor

答案是,这里有一个可变模板版本,如果你必须将几个值组合在一起,它的用法会更简洁:

代码语言:javascript
复制
inline void hash_combine(std::size_t& seed) { }

template 
inline void hash_combine(std::size_t& seed, const T& v, Rest... rest) {
    std::hash hasher;
    seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
    hash_combine(seed, rest...);
}

用法:

代码语言:javascript
复制
std::size_t h=0;
hash_combine(h, obj1, obj2, obj3);

这最初是为了实现一个可变的宏来轻松地使自定义类型hashable (我认为这是

函数):

代码语言:javascript
复制
#define MAKE_HASHABLE(type, ...) \
    namespace std {\
        template<> struct hash {\
            std::size_t operator()(const type &t) const {\
                std::size_t ret = 0;\
                hash_combine(ret, __VA_ARGS__);\
                return ret;\
            }\
        };\
    }

用法:

代码语言:javascript
复制
struct SomeHashKey {
    std::string key1;
    std::string key2;
    bool key3;
};

MAKE_HASHABLE(SomeHashKey, t.key1, t.key2, t.key3)
// now you can use SomeHashKey as key of an std::unordered_map
票数 41
EN

Stack Overflow用户

发布于 2019-02-17 06:29:59

几天前,我想出了一个稍微改进的版本

这个答案

(需要C++ 17支持):

代码语言:javascript
复制
template 
void hashCombine(uint& seed, const T& v, Rest... rest)
{
    seed ^= ::qHash(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
    (hashCombine(seed, rest), ...);
}

上面的代码在代码生成方面更好。我在代码中使用了Qt中的qHash函数,但也可以使用任何其他散列器。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2590677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档