C++ 如何更改std::hash<;中的默认种子>;?

C++ 如何更改std::hash<;中的默认种子>;?,c++,c++11,hash,C++,C++11,Hash,我从中了解到,std::unordered_map中使用的默认哈希函数是hash2 // This file defines Hash_bytes, a primitive used for defining hash // functions. Based on public domain MurmurHashUnaligned2, by Austin // Appleby. http://murmurhash.googlepages.com/ 我的问题是如何更改该散列函数的默认种子,因为

我从中了解到,
std::unordered_map
中使用的默认哈希函数是hash2

// This file defines Hash_bytes, a primitive used for defining hash
// functions. Based on public domain MurmurHashUnaligned2, by Austin
// Appleby.  http://murmurhash.googlepages.com/
我的问题是如何更改该散列函数的默认种子,因为常量散列种子很容易被黑客攻击


p、 我知道我可以使用我自己的散列因子来处理
无序的\u-map
。但是我的问题是关于C++11的内置哈希函数的种子。

std::unordered_map的第三个模板参数是要使用的哈希函数,它可以设置为您想要的任何哈希函数。

注意,根据Wikipedia,Murrushash()是一个非加密哈希函数,因此,如果需要强加密,则不适合

但是,在
std::unordered_map
中,哈希不是出于安全原因而使用的,而是用于将密钥/值对组织到内存桶中。此外,例如在gcc中,基本类型根本不进行散列,而是重新解释为
size\t
。发件人:

值得注意的是,一些实现使用平凡(标识)散列函数 它将整数映射到自身。换句话说,这些散列函数 设计用于处理无序关联容器,但不是 例如,加密散列

如果仍然希望更改哈希的种子,则需要实现一个函子对象并提供自己的哈希算法。下面的代码应该让您了解如何挂接自己的哈希实现,或者如何直接使用HarrulHash2并提供种子

//HACK
表示的行将使用gcc库实现(
std::_hash_impl::hash
)中的哈希函数,并取决于特定的编译器/库实现。正如其他人指出的,不鼓励直接使用此功能

如果需要对
std::string
以外的其他类型进行散列,则需要实现不同的模板专门化

#include <string>
#include <unordered_map>
#include "MurmurHash2.h"

template <class T> struct MyHash;
template<> struct MyHash<std::string>
{
    std::size_t operator()(std::string const& s) const noexcept
    {
        size_t seed = static_cast<size_t>(0xdeadbeef);
        //return std::_Hash_impl::hash(s.data(), s.length(), seed); //HACK
        return MurmurHash2 ( s.data(), s.length(), seed );
    }
};


int main()
{
    std::unordered_map<std::string,std::string,MyHash<std::string> >
            u_map { {"s1","A"} , {"s2","B"} };
    return 0;
};
#包括
#包括
#包括“2.h”
模板结构MyHash;
模板结构MyHash
{
std::size\u t运算符()(std::string const&s)const noexcept
{
种子大小=静态浇铸(0x0);
//返回std::_Hash_impl::Hash(s.data(),s.length(),seed);//HACK
返回hash2(s.data(),s.length(),seed);
}
};
int main()
{
std::无序图
u_图{{“s1”,“A”},{“s2”,“B”};
返回0;
};

从github获取MurruHash。

使用您自己的hash functor,您可以随意设置种子。正如m.s.所指出的,不应该直接使用_hash_impl,这可能是一个相当棘手的问题:-)但是代码应该简单地告诉您如何挂接您自己的hash实现,或者如何直接使用MurruHash2并提供种子。我在代码中更改了它。@JanMüller前面的答案对我来说很好。请把它加到答案上。谢谢,我知道。但我不想编写自己的哈希函数,因为杂音哈希已经足够好了。有没有简单的方法来更改哈希函数的种子?