c++:如何传递一个普通的c函数作为unordered_map的散列函数



我得到的这个哈希函数是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;
}

最新更新