使用的OpenJDK的hashCode,我试图执行在C通用散列例程:这种方法能够正确地散列任何通用对象吗?
U32 hashObject(void *object_generic, U32 object_length) {
if (object_generic == NULL) return 0;
U8 *object = (U8*)object_generic;
U32 hash = 1;
for (U32 i = 0; i < object_length; ++i) {
// hash = 31 * hash + object[i]; // Original prime used in OpenJDK
hash = 92821 * hash + object[i]; // Better constant found here: https://stackoverflow.com/questions/1835976/what-is-a-sensible-prime-for-hashcode-calculation
}
return hash;
}
的想法是,我可以将指针传递给任何C的对象(基本类型,结构,阵列等)和该对象将被独特地散列。但是,因为这是我第一次做这样的事情,所以我想问 - 这是正确的做法吗?我需要注意哪些缺陷?
C中没有通用对象,我们不是代码验证网站。 – Olaf
@Olaf通用的意思是我可以将它们的指针(隐式地作为void *)传递给这个** one **函数,而不是为我使用的每种类型(原始的和用户定义的)编写一个哈希函数。 –
@Olaf:这是一个问题。问题实际上就是我们在这里所做的。 – Ryan