You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将普通C函数作为unordered_map的哈希仿函数传入

如何将C风格哈希函数用作unordered_map的哈希参数?

你不需要必须编写自定义仿函数包装器,有几种更便捷的方式可以直接把这个C风格函数作为unordered_map的哈希参数:

方式一:直接使用函数指针

unordered_map的第三个模板参数可以指定为函数指针类型,然后在构造容器时传入你的哈希函数指针:

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);
}

// 定义哈希类型为函数指针
using MyHashMap = std::unordered_map<int, std::string, size_t(*)(size_t)>;
// 构造时传入哈希函数指针
MyHashMap my_map(10, Wang_Jenkins_hash);

这种方式的缺点是每次构造容器都需要显式传递函数指针。

方式二:用std::integral_constant包装函数指针

通过std::integral_constant把函数指针包装成一个可调用的类型,这样可以直接作为模板参数使用,无需构造时传参:

#include <type_traits>

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);
}

// 用integral_constant包装函数指针
using WangJenkinsHash = std::integral_constant<size_t(*)(size_t), Wang_Jenkins_hash>;

// 直接使用包装后的类型作为哈希参数
std::unordered_map<int, std::string, WangJenkinsHash> my_map;

std::integral_constant的operator()会自动调用你传入的哈希函数,使用起来和自定义仿函数一样方便。

方式三:C++17及以上使用无状态lambda

C++17允许将无状态lambda作为模板参数,你可以直接把哈希逻辑写在lambda里,或者用lambda包装你的函数:

// 直接在lambda中实现哈希逻辑
auto 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);
};

// 用lambda的类型作为哈希参数
using MyHashMap = std::unordered_map<int, std::string, decltype(wang_jenkins_hash)>;
MyHashMap my_map;

这种方式最简洁,不需要额外的类型定义,适合C++17及更高版本的环境。


内容的提问来源于stack exchange,提问作者Troskyvs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:48:29