如何让GHashTable兼容64位XXH3_64bit哈希函数的问题
如何让GHashTable兼容64位XXH3_64bit哈希函数的问题
嘿,我来帮你搞定这个GHashTable和XXH3_64bits兼容的麻烦!
首先得点出你代码里的两个核心问题:
- 第一个是类型不匹配:GHashTable要求的哈希函数(
GHashFunc)必须返回32位的guint类型,但你写的xxh3_64bits_map返回的是64位的uint_fast64_t,编译器肯定会跳出来报错。 - 第二个是key长度计算完全错误:
_countof(key)这行根本不对,因为key是个指针,_countof只会返回指针本身的大小(比如4或8字节),根本不是key指向的实际数据长度,这会导致XXH3算出完全错误的哈希值。
接下来给你两种靠谱的解决思路,核心都是把64位哈希转成32位——毕竟GHashTable就认32位的哈希值:
方案一:64位哈希降位为32位(推荐异或法)
这是最常用的降位方式,把64位哈希的高32位和低32位做异或,能尽量保留哈希的随机特性,比直接截断低32位的冲突概率更低。同时一定要把key长度的问题修正过来,比如如果你的key是C风格字符串,就用strlen获取长度;如果是固定长度的结构体,就用sizeof。
修改后的完整代码示例:
#define XXH_INLINE_ALL #define XXH_NAMESPACE #include <xxhash.h> #include <stdlib.h> #include <glib.h> #include <string.h> // 要包含strlen的头文件 guint xxh3_adapt_for_ghashtable(const void* key) { // 假设key是C风格字符串,这里替换成你实际的key长度计算方式 size_t key_len = strlen((const char*)key); // 计算64位哈希 uint64_t hash64 = XXH3_64bits(key, key_len); // 高32位异或低32位,转成32位的guint return (guint)((hash64 >> 32) ^ hash64); } int main(int argc, char* argv[]) { GHashTable* hash_table = g_hash_table_new(xxh3_adapt_for_ghashtable, NULL); // 这里可以加哈希表的操作逻辑 g_hash_table_destroy(hash_table); // 别忘了销毁哈希表,避免内存泄漏 return 0; }
方案二:直接截断64位哈希的低32位
如果觉得异或操作麻烦,直接取64位哈希的低32位也能用,代码更简单,只是冲突概率比异或略高一点,大部分场景下也完全够用:
guint xxh3_adapt_for_ghashtable(const void* key) { size_t key_len = strlen((const char*)key); uint64_t hash64 = XXH3_64bits(key, key_len); // 直接返回低32位 return (guint)hash64; }
关键注意点
- 无论用哪种方案,key长度的计算一定要准确:如果你的key不是字符串,比如是自定义结构体,就把
strlen((const char*)key)换成sizeof(YourKeyStruct);如果是动态长度的数据,你得把长度和key一起存在哈希表里,或者用其他方式获取正确的长度——XXH3必须知道输入的准确长度才能算出正确的哈希。 - 修改后的哈希函数返回
guint,完全符合GHashFunc的类型要求,编译器就不会再报类型不兼容的错误了。
备注:内容来源于stack exchange,提问作者Brain_driver_not_found
相关产品推荐
相关产品推荐

