[英]Is this SuperFashHash implementation computing a proper 31-bit hash of a string?
[英]31-bit Bijective (Perfect) Hash algorithm
我需要的
我需要一種產生雙射輸出的算法。 我有一個31位輸入,需要一個偽隨機31位輸出。
我考慮過的
CRC在其位寬內是雙射的。
我查看了谷歌,可以找到這個多項式,但不是表格或算法。
有人能指出我正確的方向嗎?
我需要一個CRC-31算法,使用多項式,例如0x737e312b,或任何能夠做我需要的雙射函數。
注意
我發現了以下代碼,但遺憾的是我沒有編譯和運行它的工具。
對於任何哈希函數hash
,您可以:
function bijectiveHash31(int val) {
val &= 0x7FFFFFFF; //make sure it's 31 bits
for (int i=0; i<5; ++i) {
// the high bits affect the low bits
val ^= hash(val>>15) & 32767;
// rotate bits
val = ((val&32767)<<16) | ((val>>15)&65535);
}
return val;
}
這是一個Feistel結構,它構成了許多密碼的基礎: https : //en.wikipedia.org/wiki/Feistel_cipher
如果你需要快速而且你不需要它超級好,那么這很好用:
function bijectiveHash31(int val) {
val = ((val*RANDOM_ODD_NUMBER) + RANDOM_NUMBER) & 0x7FFFFFFF;
val ^= (val>>15);
val ^= (val>>8);
return val;
}
在這兩種情況下,要弄清楚如何撤消每個基本操作並不太難 ,這表明整個哈希是雙射的。 如果您需要幫助確定乘法,請參閱https://en.wikipedia.org/wiki/Modular_multiplicative_inverse
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.