我得到的这个哈希函数是C风格的:
static size_t Wang_Jenkins_hash(size_t h) {
h += (h << 15) ^ 0xffffcd7d;
h ^= (h >> 10);
h += (h << 3);
h ^= (h >> 6);
h += (h << 2) + (h << 14);
return h ^ (h >> 16);
}
然后,我尝试将其用于unordered_map的哈希参数。我是否总是需要编写一个c++函子作为包装器才能使用它?或者有更方便的方法将其作为模板参数传递吗?
谢谢!
函数可能是最简单的方法。当您使用免费函数时,语法将变为
std::unordered_map<std::size_t, std::size_t, decltype(&Wang_Jenkins_hash)>
但这只是你所需要的一半。由于我们使用的是函数指针类型,我们需要将要使用的函数传递给映射,为此,您必须指定需要多少初始存储桶以及要实际使用的函数。这可以像一样完成
std::unordered_map<std::size_t, std::size_t, decltype(&Wang_Jenkins_hash)> foo(1024, &Wang_Jenkins_hash);
如果您切换到函子,则代码可以更改为
struct Wang_Jenkins_hash
{
std::size_t operator()(std::size_t h) noexcept const
{
h += (h << 15) ^ 0xffffcd7d;
h ^= (h >> 10);
h += (h << 3);
h ^= (h >> 6);
h += (h << 2) + (h << 14);
return h ^ (h >> 16);
}
};
std::unordered_map<std::size_t, std::size_t, Wang_Jenkins_hash> foo;
如果您可以使用C++20或更新版本,那么您可以将函数封装在lambda中,以便与等地图一起使用
auto my_hash = [](auto val) { return Wang_Jenkins_hash(val); };
std::unordered_map<std::size_t, std::size_t, decltype(my_hash)> foo;
是的,可能是
#include <iostream>
#include <unordered_map>
size_t Wang_Jenkins_hash(size_t h) {
h += (h << 15) ^ 0xffffcd7d;
h ^= (h >> 10);
h += (h << 3);
h ^= (h >> 6);
h += (h << 2) + (h << 14);
return h ^ (h >> 16);
}
int main() {
std::unordered_map<size_t, size_t, decltype(&Wang_Jenkins_hash)> m(0, &Wang_Jenkins_hash);
return 0;
}