我需要的
我需要一种产生双射输出的算法。我有一个 31 位输入,需要一个伪随机 31 位输出。
我所考虑的
CRC 在其位宽内是双射的。
我在谷歌上看过,可以找到多项式,但找不到表格或算法。
谁能指出我正确的方向?
我需要一个使用多项式 0x737e312b 的 CRC-31 算法,或者任何可以满足我需求的双射函数。
笔记
我找到了以下代码,但不幸的是我没有编译和运行它的工具。
我需要的
我需要一种产生双射输出的算法。我有一个 31 位输入,需要一个伪随机 31 位输出。
我所考虑的
CRC 在其位宽内是双射的。
我在谷歌上看过,可以找到多项式,但找不到表格或算法。
谁能指出我正确的方向?
我需要一个使用多项式 0x737e312b 的 CRC-31 算法,或者任何可以满足我需求的双射函数。
笔记
我找到了以下代码,但不幸的是我没有编译和运行它的工具。
对于任何散列函数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