首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用这样的MD5散列的子字符串是否足够独特?

问使用这样的MD5散列的子字符串是否足够独特?
EN

Stack Overflow用户
提问于 2010-02-14 12:03:36
回答 3查看 3.7K关注 0票数 9

我想做的是为我网站上的文章创建一个12个字符的id,类似于youtube处理他们的视频id (http://www.youtube.com/watch?v=53iddd5IcSU)的方式。现在,我正在生成一个MD5散列,然后像这样抓取其中的12个字符:

代码语言:javascript
复制
$ArticleId = substr(MD5("Article".$currentID),10,12)

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

我有点偏执地认为我会遇到一个重复的$ArticleId,但现实地说,这种情况发生的可能性有多大?而且,由于我的数据库中的列是唯一的,我如何处理这种罕见的情况,而不抛出一个丑陋的错误?

附注:我做了一个小脚本来检查前5000 $文章I中的重复项,但是没有。

编辑:我不喜欢base64_encode散列的方式,所以我这样做:

代码语言:javascript
复制
function retryAID($currentID)
{
    $AID = substr(MD5("Article".$currentID*2),10,12);

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


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

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

由于AID列是唯一的,因此mysql_query将抛出一个错误,并且retryAID函数将找到一个唯一的id...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-14 13:41:39

代码语言:javascript
复制
<?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, 10, 36), 4, "0", STR_PAD_LEFT);
    }
    return $id;
  }
?>

返回以36为基数的12个字符的数字,它提供4,738,381,338,328,321,616,896种可能性。(碰撞的概率取决于随机数生成器的分布。)

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

代码语言:javascript
复制
<?php
do {
  $id = get_id();
} while ( !update_id($id) );
?>
票数 1
EN

Stack Overflow用户

发布于 2010-02-14 12:09:24

不,不是很独特。

如果你需要更短的代码,为什么不用base64进行编码呢?

票数 0
EN

Stack Overflow用户

发布于 2010-02-14 13:16:41

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2260098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档