int(11) 到固定数字(8 个字符)uniq 哈希
我遇到以下问题:
- user_id(int(10))
oerder_type(tinyint(1))
从 1)+2) = int(11) 转换为哈希
[0-9a-z]{8}
I have a issue the following:
- user_id(int(10))
oerder_type(tinyint(1))
convert from 1)+2) = int(11) to a hash
[0-9a-z]{8}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您只需要一个哈希函数来查找哈希表,我建议使用 Murmurhash。 10^11 介于 2^36 和 2^37 之间。因此,调用生成 64 位 (Murmurhash2) 或 128 位 (Murmurhash3) 哈希以及 mod 10^11 的哈希。与简单地转换基数不同,使用哈希函数可能会产生冲突,即使它是高度(如果不是完美)均匀分布的。然而,你会得到更好的雪崩效果。 此处是其雪崩测试结果。
如果 Murmurhash 不可行,Jenkins 查找 功能也不错。 这里是它的雪崩测试结果。
如果性能不是问题,或者需要加密安全,SHA-1 可能是最佳选择,它有更多不同语言的包装器。不要使用 CRC32(坏雪崩)。
编辑:如果您需要PHP哈希函数,这里是示例代码
另外,还有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
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.
您可以使用简单的哈希函数,因为:
[0-9a-z]{8}
的范围大于10^12 - 1
。简单的哈希函数是将您的数字从基数 10 转换为基数 36,并将 0 填充到所需的长度。正如所指出的,这可能不满足一致性。然而,对于散列函数来说,通常需要一致性来最小化冲突成本,而在这种情况下不存在冲突。
如果这不能满足您的要求,那么您需要更具体。
You can use a trivial hash function because:
The range of
[0-9a-z]{8}
is larger than10^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.