int(11) 到固定数字(8 个字符)uniq 哈希

发布于 2024-11-03 06:11:37 字数 147 浏览 5 评论 0原文

我遇到以下问题:

  1. user_id(int(10))
  2. oerder_type(tinyint(1))

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

    [0-9a-z]{8}

I have a issue the following:

  1. user_id(int(10))
  2. oerder_type(tinyint(1))

    convert from 1)+2) = int(11) to a hash

    [0-9a-z]{8}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

汹涌人海 2024-11-10 06:11:37

如果您只需要一个哈希函数来查找哈希表,我建议使用 Murmurhash。 10^11 介于 2^36 和 2^37 之间。因此,调用生成 64 位 (Murmurhash2) 或 128 位 (Murmurhash3) 哈希以及 mod 10^11 的哈希。与简单地转换基数不同,使用哈希函数可能会产生冲突,即使它是高度(如果不是完美)均匀分布的。然而,你会得到更好的雪崩效果。 此处是其雪崩测试结果。

如果 Murmurhash 不可行,Jenkins 查找 功能也不错。 这里是它的雪崩测试结果。

如果性能不是问题,或者需要加密安全,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

另外,还有Murmurhash2 的 PHP 扩展。如果您在 Linux 上运行 PHP,则可以编译并安装。用 Murmurhash3 替换那些 Murmurhash2 文件可能会更好。

If you simply need a hash function for hash table lookup, I recommend using Murmurhash. 10^11 is between 2^36 and 2^37. Therefore, call a hash that generate 64-bit (Murmurhash2) or 128-bit (Murmurhash3) hash, and mod 10^11. Unlike simply converting bases, using hash function may generate conflicts, even it is highly (if not perfectly) uniformly distributed. However, you will get much better avalanche effect. Here is its avalanche test result.

If Murmurhash is not possible, Jenkins lookup functions are also good. Here is its avalanche test result.

If performance is not a problem, or it is required cryptographic secure, SHA-1 might be the best pick, which has much more wrappers in various languages. Do not use CRC32 (bad avalanche).

EDIT: If you need PHP hash function, here is a sample code

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

Also, there is PHP extension for Murmurhash2. You can compile and install if you run PHP on Linux. Replace those Murmurhash2 files with Murmurhash3 might be even better.

拍不死你 2024-11-10 06:11:37

您可以使用简单的哈希函数,因为:

36^8      = 2821109907456
10^12 - 1 = 999999999999

[0-9a-z]{8} 的范围大于 10^12 - 1。简单的哈希函数是将您的数字从基数 10 转换为基数 36,并将 0 填充到所需的长度。

正如所指出的,这可能不满足一致性。然而,对于散列函数来说,通常需要一致性来最小化冲突成本,而在这种情况下不存在冲突。

如果这不能满足您的要求,那么您需要更具体。

You can use a trivial hash function because:

36^8      = 2821109907456
10^12 - 1 = 999999999999

The range of [0-9a-z]{8} is larger than 10^12 - 1. The trivial hash function would be to convert your number from base 10 to base 36 and left padd with 0 to the required length.

As it was pointed out, this might not satisfy uniformity. However for a hash function uniformity is usually required to minimize the cost of collisions which do not exist in this case.

If that doesn't satisfy your requirements then you need to get more specific.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文