哈希指针值

时间:2010-08-09 17:42:31

标签: algorithm pointers hash

有时您需要使用指针的哈希函数;不是指针指向的对象,而是指针本身。很多时候,人们只是将指针值作为整数,将一些高位切断以使其适合,可能会在底部移出已知零位。事实是,指针值不一定在代码空间中很好地分布;事实上,如果你的分配器正在完成它的工作,那么它们很可能会聚集在一起。

所以,我的问题是,是否有人开发了对此有益的哈希函数?取一个32位或64位的值,它可能在某处中得到12位熵,并将其均匀地分布在32位数字空间中。

4 个答案:

答案 0 :(得分:20)

This page列出了几种可能有用的方法。其中一个,由于Knuth,是一个简单的乘法(32位)乘2654435761,但“如果密钥在高位变化,则产生错误的散列结果。”在指针的情况下,这是一个非常罕见的情况。

Here是更多算法,包括性能测试。

似乎魔术词是“整数散列”。

答案 1 :(得分:3)

他们可能会展示地点,是的 - 但是在较低位,这意味着对象将通过哈希表分发。如果指针的地址是另一个指针的哈希表长度的倍数,则只能看到冲突。

答案 2 :(得分:2)

如果您知道可能的最低指针地址(如果您在大缓冲区中工作,通常就是这种情况),只需通过减去可能的最低指针值将指针转换为整数;例如。这可能是缓冲区的基地址。 -Remember:从指针中减去的指针等于偏移量(整数)。 所以:不要“砍掉”比特;转换为偏移量要好得多。 这将导致偏移值远小于指针值。 在某些情况下,在对其进行散列之前,可能有助于进一步将指针值右移两次(例如,除以4)。 指针的问题通常是可能在同一地址上分配小块内存(例如,一个块被释放而另一个块正在占用释放块的位置)。

答案 3 :(得分:1)

为什么不使用现有的hash function