旗下导航:搜·么
当前位置:网站首页 > PHP问题 > 正文

PHP 的 uniqid 函数发生的 id 真的是唯一的么?【php题目】

作者:搜搜PHP网发布时间:2019-11-26分类:PHP问题浏览:90


导读:近来运用到了uniqid,就发生了疑问?uniqid生成的id由什么构成?真的是唯一的么?什么情况下会发生争执?从文档中看到uniqid函数有两个参数...

近来运用到了 uniqid,就发生了疑问?uniqid 生成的 id 由什么构成?真的是唯一的么?什么情况下会发生争执?

从文档中看到 uniqid 函数有两个参数

uniqid 的构造

看源码:

PHP_FUNCTION(uniqid)
{
    ...
    gettimeofday((struct timeval *) &tv, (struct timezone *) NULL);
    sec = (int) tv.tv_sec;
    usec = (int) (tv.tv_usec % 0x100000);

    ...    if (more_entropy) {
        uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10);
    } else {
        uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec);
    }

    RETURN_STR(uniqid);
}

基本就相识清晰了。uniqid 是由四个部份构成:

prefix + sec + usec + “.” + php_combined_lcg

个中 prefix 就是 uniqid 函数的第一个参数。它是一个字符串,通报进来什么,就直接返回什么。

sec 是当前时钟的秒,usec 是毫秒,这两个值都是从 gettimeofday 猎取的。换句话说,只要在一台机械上,两个 php 顺序在同一个毫秒内猎取的 sec 和 usec 是一样的。

php_combined_lcg 是 uniqid 的第二个参数决议的,它是一个墒值,它是运用线性同余生成一个 0 ~ 1 之间的随机数。假如第二个参数为 true,就有这个值,假如第二个参数为 false,就没有这个值。

比方:

➜  ~ php -r 'echo uniqid("my_", true);'my_5afe9b414c2141.76621929

结论

所以说,假如我们纯真运用 uniqid() 这个要领,不带任何参数的话,这个要领只能保证单个历程,在同一个毫秒内是唯一的。假如运用uniqid("", true)。 带了一个墒值,本身已经有一个随机的体式格局能保证生成的id的随机性了。然则因为线性同余是比较简单的生成随机数的算法,随机性有能够还不够,所以,网上撒布的一种更随机数值的体式格局是:

uniqid(mt_rand(), true)

个中 mt_rand() 生成随机数就不是运用线性同余生成随机数的体式格局了,而是运用 Mersenne Twister Random Number Generator (梅森扭转算法)。换句话说,上面这个 id 由两种随机算法 + 时候戳生成。基本上,这个算法在很大程度上能保证唯一性了(假如要问争执率的话,预计只要数学系门生能研究出来了...)。

上面的这个给出的id会有一个点号,而且长度并非128bit。假如愿望生成uuid,就需要一个hash,不管是md5,sha1 都是能够挑选的。所以网上又有一种生成唯一码的体式格局。(php视频教程)

md5(uniqid(mt_rand(), true))

然则,本质上,这两种体式格局的随机性是相称的。

md5(uniqid(mt_rand(), true))--------亲证这个结果好,不会重,就是没规律----我本身的话

以上就是PHP 的 uniqid 函数发生的 id 真的是唯一的么?的细致内容,更多请关注ki4网别的相干文章!

标签:phpuniqidid唯一