簡體   English   中英

31位雙射(完美)哈希算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM