int(11)到Fixed num(8个字符)唯一哈希

时间:2011-04-27 00:11:15

标签: php hash unique uniqueidentifier

我遇到以下问题:

  1. USER_ID(INT(10))
  2. oerder_type(TINYINT(1))

    从1)+2)= int(11)转换为哈希

    [0-9A-Z] {8}

2 个答案:

答案 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转换为所需的长度。

正如有人指出的那样,这可能无法满足一致性。然而,对于散列函数,通常需要均匀性以最小化在这种情况下不存在的冲突的成本。

如果这不符合您的要求,那么您需要更具体。