Hash 从32个字符的字符串中获取16个字符的字符串

Hash 从32个字符的字符串中获取16个字符的字符串,hash,md5,Hash,Md5,如何从32个字符长的字符串中获取16个字符长的字符串。 此32个字符的字符串是md5哈希。那么,如何使获得的16个字符的字符串也合理地唯一呢? 我每月需要生成大约100000个这样的字符串。我需要确保生成的所有字符串在所有运行中都是唯一的。最好的方法可能是每隔一个字符使用一次 比如说, ipm98u2nm0c87ne0p87n87bnvjckp97w -> im82mc7ep78bvcp7 这可能是尽可能保持其唯一性的最佳方法,但如中所述,删除字符的问题在于,删除字符时,实际上是将唯一字

如何从32个字符长的字符串中获取16个字符长的字符串。 此32个字符的字符串是md5哈希。那么,如何使获得的16个字符的字符串也合理地唯一呢?
我每月需要生成大约100000个这样的字符串。我需要确保生成的所有字符串在所有运行中都是唯一的。

最好的方法可能是每隔一个字符使用一次

比如说,

ipm98u2nm0c87ne0p87n87bnvjckp97w ->
im82mc7ep78bvcp7

这可能是尽可能保持其唯一性的最佳方法,但如中所述,删除字符的问题在于,删除字符时,实际上是将唯一字符串的数量除以36(或可能的字符数)。

我将解释我的原始注释。如果您的唯一密钥不依赖于某些数据,请使用UUID或如我所说:

$string = str_shuffle('abcdefjhijklmnopqrstuvwxyz1234567890');
$uniqe = substr($string, 0, 16);

var_dump($uniqe);

如果您的唯一键应该依赖于任何数据,并且长度正好为1个字符,请使用其他产生64个值的散列算法。要查看散列算法列表,请查看

um。。。以其他角色为例?阅读关于碰撞的文章,我建议你不要按照你写的那样做。您可以自己生成16个字符的密钥。比如用可用字符创建字符串,然后str_shuffle并替换前16个字符。只是一个想法。它需要可逆吗?这是一种压缩算法还是另一种哈希算法?您说它必须是“合理独特的”,但md5中已经存在冲突。我想你所说的合理独特,只是指。。。不太可能和其他东西一样?我有点想质疑这个“2倍”的数字,但我不太擅长统计,不知道怎么做。举个例子,从“ipm”到“im”会为iam、ibm、icm等创建可能性。看起来碰撞的几率呈指数增长,而不是线性增长。也许有比我更清楚的人可以证实/反驳?@Gray-Hm,这是一个很好的观点。当您删除一个字符时,实际上是将可能的数量除以使用的字符数量。我将编辑我的答案。如果我必须每月生成大约100000个16字符的字符串,碰撞的概率仍然很低,对吗?还是@zaq178的解决方案更好?