我有一个结构:
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
,另一个struct
,enum
,指针,...