其实3个都有碰撞到的概率如果极其低下的话,为何不用3个拿来查找?只要保证查到的那个和结构体包含的俩个与算出的3个hash存在一定顺序相等。
但是这个方法会存在误判。不知道数据规模多大才会造成误判。
改进:
结构体中存在一个bExists的bool类型(1字节)。可以取其2个高位。00表示HashA HashB;01表示HashB Hash;10表示HashA Hash;11用于后5位。后5位表示下一个位置,如果前2位不为11,范围为1~31(0表示不存在),否则范围为32~63,如果为FFFFF则表示超过63个。最低位为原先的Exists。
此外结构体这样定义
typedef struct _HASHTABLE
{
long nHashA;
long nHashB;
bool bExists;
}HASHTABLE, *PHASHTABLE ;
会造成占用空间为12字节。long在这里使用4字节,long + long + bool一共占用9字节,编译器填充3字节,浪费内存。
其他方法:
暴雪hash算法,(不理解?稍作改进?)_wejoncy的专栏-CSDN博客_暴雪公司hash的改进 https://blog.csdn.net/wejoncy/article/details/51280779
这个方法我感觉会很浪费内存。因为空间大小取值正常情况下hash的冲突不高。
具体代码
最近太忙了,有空实现。