php – 使用像这样的MD5哈希的子字符串是否足够独特?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 使用像这样的MD5哈希的子字符串是否足够独特?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要做的是为我的网站上的文章创建一个12个字符的id,类似于youtube处理他们的视频ID( http://www.youtube.com/watch?v=53iddd5IcSU).现在我生成一个MD5哈希,然后像这样抓取它的12个字符:
$Articleid = substr(MD5("Article".$currentID),10,12)

其中$currentID是数据库中的数字ID(例如144)

我有点偏执,我会遇到重复的$ArticleId,但实际上这会发生什么机会?而且,由于我的数据库中的列是唯一的,如何在不抛出丑陋错误的情况下处理这种罕见的情况?

附:我做了一个小脚本来检查前5000 $ArticleId中的重复项,但没有.

编辑:我不喜欢base64_encode哈希的样子,所以我这样做:

function retryaiD($currentID)
{
    $AID = substr(MD5("Article".$currentID*2),12);

    $setAID = "UPDATE `table` SET  `artID` =  '$AID' WHERE `id` = $currentID ";
    @R_419_1681@_query($setLID) or retryAID($currentID);
}


$AID = substr(MD5("Article".$currentID),12);

$setAID = "UPDATE `table` SET  `artID` =  '$AID' WHERE `id` = $currentID ";
@R_419_1681@_query($setAID) or retryAID($currentID);

由于AID列是唯一的,@R_419_1681@_query将抛出错误,retryAID函数将找到唯一的id …

<?PHP
  function get_id()
  {
    $max = 1679615; // pow(36,4) - 1;
    $id = '';

    for ($i = 0; $i < 3; ++$i)
    {
      $r = mt_rand(0,$max);
      $id .= str_pad(base_convert($r,36),4,"0",STR_PAD_LEFT);
    }
    return $id;
  }
?>

在base-36中返回一个12个字符的数字,它给出了4,738,381,338,321,616,896种可能性. (碰撞的概率取决于随机数发生器的分布.)

为确保不发生冲突,您需要循环:

<?PHP
do {
  $id = get_id();
} while ( !update_id($id) );
?>

脚本宝典总结

以上是脚本宝典为你收集整理的php – 使用像这样的MD5哈希的子字符串是否足够独特?全部内容,希望文章能够帮你解决php – 使用像这样的MD5哈希的子字符串是否足够独特?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。