C-具有n个无符号int属性的哈希结构

C-具有n个无符号int属性的哈希结构,c,hash,integer,C,Hash,Integer,我有一个结构: struct A { unsigned int a, b, c, d, ... } 我想做一个函数: unsigned int A_hash(const A* const var) { return ... } 返回的数字必须非常大,因为如果A_hash(var)

我有一个结构:

struct A
{
    unsigned int a, b, c, d, ...    
}
我想做一个函数:

unsigned int A_hash(const A* const var)
{

    return ...  
}
返回的数字必须非常大,因为如果
A_hash(var)
,则哈希表插入的模数将无法正常工作

我以前见过这样的问题,比如“接受两个整数的哈希函数”、“接受五个整数的哈希函数”等等,但是
n
整数呢?我正在寻找一种更通用的算法来进行适当的散列。它不需要是企业级的

我在想也许从一个庞大的数字开始

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


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

我想你是在问,如何像@bruceg解释的那样,将整个对象视为长字节流。如果我错了,那么你最好忽略这个答案,因为这就是我要解决的问题。请注意,此解决方案不仅适用于散列,还适用于任何需要像字节一样处理数据的情况(例如从内存或文件复制/写入数据)

我想你要找的只是一个字节一个字节地读。为此,您可以从(这是C++方法)中提取自己。例如,您可以这样编写
一个\u hash
,您可以这样调用它:

int hash = A_hash((char*)&a, sizeof(a)); // where 'a' is of type 'struct A'.
例如,您可以编写
散列
,如下所示:

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;

}
unsigned int A_散列(char*data,unsigned int dataSize)
{
无符号整数散列=someValue;
for(无符号整数i=0;i

这种方法的最大优点是,如果在结构中添加/删除字段,则不需要重写函数
sizeof(A)
将在编译时展开/缩小。另一个最大的优点是,它适用于任何值,因此您可以将该函数重用为您想要的任何类型,包括
int
、另一个
struct
、一个
enum
、一个指针,

将您的结构视为一个连续的字节数组,并使用Adler-32或其他一些滚动校验和