使用的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