C-具有N量无符号int属性的哈希结构



我有一个结构:

struct A
{
    unsigned int a, b, c, d, ...    
}

我想发挥功能:

unsigned int A_hash(const A* const var)
{
    return ...  
}

返回的数字必须非常大,因为如果A_hash(var) < myHashTable.capacity

我之前曾经看过这样的问题,例如"哈希函数","哈希函数","哈希函数占据了五个整数"等等,但是 n整数呢?我正在寻找一种更通用的算法,以实现不错的哈希。它不需要企业级。

我在想,也许从

的大量数字开始

return (0x7FFFFFFFF & a) + (0x7FFFFFFFF & b) + ...

,但我认为这还不够好。我也不知道如何阻止A_hash功能溢出,但这可能是另一个问题。

我认为您是在问您如何像@bruceg所解释的那样,像长字节流一样对待整个对象。如果我错了,那么您最好忽略这个答案,因为这是我要解决的问题。请注意,此解决方案不仅适用于哈希,而是针对您将数据视为字节(例如从/写入到内存或文件)的任何内容。

我认为您正在寻找的只是字节读取字节。为此,您可以从std::ostream::write中缩短自己(虽然这是C 方法)。例如,您可以以这样的方式编写A_hash

int hash = A_hash((char*)&a, sizeof(a)); // where 'a' is of type 'struct A'.

您可以写A_hash,例如:

unsigned int A_hash(char* data, unsigned int dataSize)
{
    unsigned int hash = someValue;
    for (unsigned int i = 0; i < dataSize; ++i)
    {
        char byte = data[i];
        doSomethingWith(hash);
    }
    return hash;
}

此方法的最大优点是,如果将/删除字段添加到结构,则无需重写该函数;sizeof(A)将在编译时扩展/减少。另一个很大的优势是它适用于任何值,因此您可以使用所需的任何类型重复使用该功能,包括int,另一个structenum,指针,...