我遇到以下问题:
oerder_type(TINYINT(1))
从1)+2)= int(11)转换为哈希
[0-9A-Z] {8}
答案 0 :(得分:1)
如果您只需要散列函数进行散列表查找,我建议使用Murmurhash。 10 ^ 11在2 ^ 36和2 ^ 37之间。因此,调用生成64位(Murmurhash2)或128位(Murmurhash3)哈希的散列,以及mod 10 ^ 11。与简单地转换基数不同,使用散列函数可能会产生冲突,即使它是高度(如果不是完美)均匀分布的。但是,你会得到更好的雪崩效果。 Here是它的雪崩测试结果。
如果不可能使用Murmurhash,Jenkins lookup的功能也很好。 Here是它的雪崩测试结果。
如果性能不是问题,或者需要加密安全,那么SHA-1可能是最好的选择,它在各种语言中拥有更多的包装器。不要使用CRC32(坏雪崩)。
编辑:如果您需要PHP哈希函数,这里有一个示例代码
function my_hash($user_id, $order_type) { // construct integer (10^11) $data = $user_id * 10 + $order_type; // convert decimal to raw binary string (at most 5 bytes) $hex = dechex($data); $binary = pack('H*', $hex); // hash binary string. Substitute 'sha1' with other algorithms listed in http://www.php.net/manual/en/function.hash-algos.php if needed $hash = hash('sha1', $binary); // output first 8 bytes return substr($hash, 0, 8); } echo my_hash(1234567890, 0); // 199f4bc7 echo my_hash(1234567890, 1); // f3706f03
此外,还有PHP extension for Murmurhash2。如果在Linux上运行PHP,则可以编译和安装。用Murmurhash3替换那些Murmurhash2文件可能会更好。
答案 1 :(得分:0)
您可以使用简单的哈希函数,因为:
36^8 = 2821109907456
10^12 - 1 = 999999999999
[0-9a-z]{8}
的范围大于10^12 - 1
。简单的哈希函数是将你的数字从基数10转换为基数36,将左边的padd转换为所需的长度。
正如有人指出的那样,这可能无法满足一致性。然而,对于散列函数,通常需要均匀性以最小化在这种情况下不存在的冲突的成本。
如果这不符合您的要求,那么您需要更具体。