php – 使用像这样的MD5哈希的子字符串是否足够独特?
发布时间:2020-12-13 13:11:27 所属栏目:PHP教程 来源:网络整理
导读:我想要做的是为我的网站上的文章创建一个12个字符的id,类似于youtube处理他们的视频ID( http://www.youtube.com/watch?v=53iddd5IcSU).现在我生成一个MD5哈希,然后像这样抓取它的12个字符: $ArticleId = substr(MD5("Article".$currentID),10,12) 其中$curr
我想要做的是为我的网站上的文章创建一个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 "; mysql_query($setLID) or retryAID($currentID); } $AID = substr(MD5("Article".$currentID),12); $setAID = "UPDATE `table` SET `artID` = '$AID' WHERE `id` = $currentID "; mysql_query($setAID) or retryAID($currentID); 由于AID列是唯一的,mysql_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) ); ?> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |