哈希图实现:---哈希码
HashMap implementation: --- hashcode
template<class KEY, class VALUE>
unsigned int HashMap<KEY, VALUE>::hashCode(KEY key)
{
unsigned int k = key & 0xffffffff; //error: no match for ‘operator&’ in ‘key & 4294967295u’
k += ~(k<<9);
k ^= (k>>14);
k += (k<<4);
k ^= (k>>10);
return k;
};
如您所见,我正在尝试通过操作对象中的位来实现哈希代码。显然,位运算符不容易应用于用户定义的对象。
我想获取任何类型的对象的一些位,给定其内存位置,并根据需要操作这些位。然后,我将位重新解释为 int,并将按位运算符应用于 int。
这听起来是个好主意吗?以及如何从给定内存位置的任何类型的对象中获取位?
多谢!
不,这是一个糟糕的主意,因为它不尊重类型对平等的定义。可以定义一个类型,以便可以将几个不同的表示形式视为相等(想想一个std::string
,它包含几个指针,没有其他任何东西。两个字符串可能相等(都包含 "hello world"
,但具有不同的指针,因为它们指向不同的内存块,因此您的哈希键实现将为两个相等的对象返回不同的哈希键。
换句话说,你会破坏哈希表,用户将无法找到他们放在表中的对象。
一个好主意。
如果不知道对象成员的详细信息,您就不知道哪些位实际上有用或与哈希相关。例如,由于对齐问题,实际数据成员之间可能存在内存间隙,并且这些间隙永远不会初始化,因此它们充满了垃圾数据。或者,如果数据成员是 char 数组字符串,则通过 null 终止符的所有字节都是垃圾,不应参与哈希。
有一些方法可以在C++中使用宏实现简单的反射,这些宏可以在这里做你真正想要的事情(即找到所有结构体的成员和类型(,但我不知道有什么好的开源的。我们的代码库中有一个工作(它有一个模板,它完全可以做你想要的,即为任意结构制作一个哈希函数(,但我无法共享它。
我想获取任何类型的对象的一些位,给定它的内存 位置,并按照我的意愿操纵位。
你在这里说的是你想将数据结构的基础位表示形式操作为一系列位。
这种方法仅适用于基元类型,例如整数、字符等。
在您的示例中,KEY
可以是任何东西,并且底层位与结构的大小一样多,因此您的and
操作并没有真正的帮助。
此外,KEY
可以是一个派生类,并开始点击虚拟指针地址等,它们是底层结构的一部分。
无论如何,在我看来,代码(即使您决定走这条路并且SO中的一些朋友专家可以指导您(也太复杂了。
最好的方法是hash
对象的每个成员。这至少是Java中遵循的方法,并且易于实现
- 如何为位集找到/实现一个好的哈希函数
- C++哈希表中,两个相同的实现,但一个给出错误
- 哈希映射如何在 c++ 中实现?
- 使用哈希表设置实现
- 为自定义类C++实现哈希
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 如何在这个哈希映射中实现 AVL 树
- 在C++中返回简单哈希码的函数
- 多项式哈希码导致负数
- 多索引哈希表实现
- 哈希图实现:---哈希码
- 哈希表实现大小调整功能
- 为什么python的字典是作为哈希表实现的,而std::map是基于树的?
- 如何在c++中获得字符串的哈希码
- 为什么c++标准库不包含哈希表实现
- 如何使用模板类的模板类子类从哈希表实现哈希集
- 在我的情况下,我如何重载相等的方法以使不同的对象在unordered_multimap具有相同的哈希码值
- 哈希表实现,集合的零冲突?发人深思的东西