php uniqid md5 绝对唯一 ID


uniqid() 函数基于以微秒计的当前时间 生成 唯一 ID
uniqid(prefix,more_entropy)
prefix 可选
为 ID 规定前缀

两个脚本恰好在相同的微秒生成 ID
该参数很有用
more_entropy 可选
规定位于返回值末尾的更多的熵

如果 prefix 参数为空
则返回的字符串有 13 个字符串长

如果 more_entropy 参数设置为 true
则是 23 个字符串长

如果 more_entropy 参数设置为 true
则在返回值的末尾添加额外的熵(使用组合线形同余数生成程序)
这样可以结果的唯一性更好
以字符串的形式返回唯一标识符

由于基于系统时间
通过该函数生成的 ID 不是最佳
即使使用了第二个参数
也会重复
如需生成绝对唯一的 ID
最好的方案是结合md5函数来生成唯一ID
public static function generateNum() {//获取唯一序列号
    //strtoupper转换成全大写的
    $charid = strtoupper(md5(uniqid(mt_rand(), true)));
    $uuid = substr($charid, 0, 8).substr($charid, 8, 4).substr($charid,12, 4).substr($charid,16, 4).substr($charid,20,12);
    return $uuid;
}
<?php
    $units = array();
    for($i=0;$i<1000000;$i++){
        $units[] = md5(uniqid(md5(microtime(true)),true));
    }
    $values  = array_count_values($units);
    $duplicates = [];
    foreach($values as $k=>$v){
        if($v>1){
            $duplicates[$k]=$v;
        }
    } //生成绝对唯一的 ID
    echo '<pre>';
    print_r($duplicates);
    echo '</pre>';
?>