PHP-php生成 uniq id有没有比较好的方案?

小组事务管理 小组事务管理 主题:974 回复:1955

PHP-php生成 uniq id有没有比较好的方案?

瑾兮 发布于 2017-07-23 字数 182 浏览 1103 回复 5

有一个需求,要给每一条数据生成一个ID,不可重复,犹豫业务要求,不能用MySQL的auto increment,只能用程序生成ID。
我现在想到的方案是用

$uniqid = md5(microtime());

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(5

清晨说ぺ晚安 2017-09-11 5 楼

 /**

  • fast_uuid 为模型生成 64 位整数或混淆字符串的不重复 ID

  • 感谢“Ivan Tan|谭俊青 DrinChing (at) Gmail.com”提供的算法。

  • 通常我们习惯使用自增字段来做主键,简单易用。

  • 但在于大规模应用中,使用自增字段将难以实现分布式数据库架构。

  • 并且对数据进行纵向和横向分割(分表分库)造成障碍。

  • 此时最好的解决方案是使用 UUID。

  • 但 UUID 不是每一种数据库都支持,用字符串来模拟效率太低。

  • 并且如果通过 URL 传递,UUID 也显得太长。

  • fast_uuid 方法提供了另一种解决方案:

  • 使用 64bit 整数存储主键,主键由 fast_uuid 方法在创建记录时调用生成。

  • 参数 suffix_len指定 生成的 ID 值附加多少位随机数,默认值为 3。

  • 即便不附加随机数也不会生成重复 ID,但附加的随机数可以让 ID 更难被猜测。

  • @param int suffix_len

  • @return string
    */
    function fast_uuid($suffix_len=3){
    //! 计算种子数的开始时间
    static $being_timestamp = 1336681180;// 2012-5-10

    $time = explode(' ', microtime());
    $id = ($time[1] - $being_timestamp) . sprintf('%06u', substr($time[0], 2, 6));
    if ($suffix_len > 0)
    {
    $id .= substr(sprintf('%010u', mt_rand()), 0, $suffix_len);
    }
    return $id;
    }

偏爱自由 2017-09-07 4 楼

string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )

有这个函数的,可以参考下手册:
http://php.net/manual/zh/function.uniqid.php

使用时设置第二个参数为true,如果设置为 TRUE, uniqid() 会在返回的字符串结尾增加额外的煽(使用combined linear congruential generator)。 使得唯一ID更具唯一性。

偏爱自由 2017-09-06 3 楼

1,可以试试mysql的 uuid() : select uuid();

2,可以自己构造自动增长字符串:

 function increment($str,$order = '') {

$len = strlen($str);
$sarr = array_reverse(str_split($str));
$order = !empty($order) ? $order : array_merge(range('a','z'),range('A','Z'),range(0,9));
$order = is_array($order) ? $order : str_split($order);
$first = current($order);
$last = end($order);
$order = array_flip($order);

foreach($sarr as $key => &$val){

if($val == $last) {
    $val = $len - 1 != $key ? $first : $first . $first;
}else {
    $val = array_search($order[$val] + 1 , $order);
    break;
    }
}
    return  join('',array_reverse($sarr));
}

$str = "abc123" ; //初始值设置在数据库中,随便设置一个

//从数据库中查到 $str

$str = increment($str);
//将新生成str记录在数据库,替换之前的值

$uniqid = md5($str);

3,或者使用php的 uniqid() 函数:
$uniqid = uniqid(rand(1, 100000));

夜无邪 2017-08-13 2 楼

自己可以加入其它的随机值呀
$key = md5(microtime(). rand(1000, 99999));
时间增长+随机数重复的可能性不大。

夜无邪 2017-07-25 1 楼

1 程序生UID (1)常用的函数组合法有 md5 hash uniqid microtime mt_rand chr hexdec
2 适合大型应用 系统每次自动生成N个唯一ID存到队列 从队列去取得
3 适合大型应用 加入一定的业务规则或者服务器hash规则 + 随机ID