uuid_t

时间:2016-05-11 04:01:37

标签: c++ hash uuid

uuid.h(package:uuid-dev)是否具有散列uuid_t变量的任何函数?

如果它存在而不是滚动我自己,那将会更好。如果没有函数,对散列过程的任何建议都可以产生相对可靠的唯一结果吗?

#ifdef WIN32
    #define GUID UUID
    #define generateGUID          UuidCreate                    // returns RPC_S_OK, RPC_S_UUID_LOCAL_ONLY, RPC_S_UUID_NO_ADDRESS
    #define hashGUID(gUid)        hash<long>()(gUid.Data1) ^ (hash<short>()(gUid.Data2) << 1) >> 1 ^ hash<short>()(gUid.Data3) << 1 ^ hash<char>()(gUid.Data4[0]) << 1
#else
    #define GUID uuid_t
    #define generateGUID          uuid_generate_random
    #define hashGUID(gUid)        ???
#endif // WIN32

namespace std
{
    template<>
    struct hash<GUID>
    {
        std::size_t operator()(const GUID& gUid) const
        {
            using std::size_t;
            using std::hash;

            return hashGUID(gUid);
        }
    };
}

编辑用法:在std容器中作为键

std::unordered_map<GUID, Component> components;

1 个答案:

答案 0 :(得分:0)

由于您想要哈希UUID以便将它们存储在哈希表中,我建议一些简单的事情:

 std::size_t operator()(const GUID& gUid) const
 {
     const uint64_t* half = reinterpret_cast<const uint64_t*>(&gUid);
     return half[0] ^ half[1];
 }

以上假设您使用的是64位平台(因此uint64_t与size_t一样宽)。