Ato*_*mix 8 php md5 uniqueidentifier
我要做的是为我网站上的文章创建一个12个字符的ID,类似于youtube处理其视频ID的方式(http://www.youtube.com/watch?v=53iddd5IcSU).现在我生成一个MD5哈希,然后像这样抓取它的12个字符:
$ArticleId = substr(MD5("Article".$currentID),10,12)
Run Code Online (Sandbox Code Playgroud)
其中$ currentID是数据库中的数字ID(例如144)
我有点偏执,我会遇到重复的$ ArticleId,但实际上这会发生什么机会?而且,由于我的数据库中的列是唯一的,如何在不抛出丑陋错误的情况下处理这种罕见的情况?
PS我制作了一个小脚本来检查第一个5000 $ ArticleId中的重复项,但没有.
编辑:我不喜欢base64_encode哈希的样子,所以我这样做:
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);
Run Code Online (Sandbox Code Playgroud)
由于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, 10, 36), 4, "0", STR_PAD_LEFT);
}
return $id;
}
?>
Run Code Online (Sandbox Code Playgroud)
返回以 36 为基数的 12 个字符数字,提供 4,738,381,338,321,616,896 种可能性。(碰撞的概率取决于随机数生成器的分布。)
为了确保不发生冲突,您需要循环:
<?php
do {
$id = get_id();
} while ( !update_id($id) );
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3082 次 |
| 最近记录: |