Laravel str_random()还是自定义函数?

Mik*_*ike 37 string random uuid function laravel

Laravel str_random()函数是否足够随机,以便我可以将其用于ID?

例如:

str_random(32);
Run Code Online (Sandbox Code Playgroud)

这将生成一个长度为32的随机字符串,由字母数字字符组成[a-zA-z0-9](总共62个字符).

这相当于2272657884496751345355241563627544170162852933518655225856的可能性.

但是,我的问题是,这是否足够好?或者我应该考虑使用UUID或其他自定义功能.

Ant*_*iro 57

str_random(Str::random())尝试使用openssl_random_pseudo_bytes哪个是为加密而非唯一性优化的伪随机数生成器.如果openssl_random_pseudo_bytes没有,它会回退到quickRandom():

public static function quickRandom($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, 5)), 0, $length);
}
Run Code Online (Sandbox Code Playgroud)

在我看来,quickRandom代码对于唯一性和加密并不可靠.

是的,拥有openssl_random_pseudo_bytes和使用32个字节几乎不可能看到碰撞,但它仍然是可能的.如果你想确保你的字符串/数字是唯一的(99.99%),你最好使用UUID函数.这就是我通常使用的:

/**
 * 
 * Generate v4 UUID
 * 
 * Version 4 UUIDs are pseudo-random.
 */
public static function v4() 
{
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

    // 32 bits for "time_low"
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),

    // 16 bits for "time_mid"
    mt_rand(0, 0xffff),

    // 16 bits for "time_hi_and_version",
    // four most significant bits holds version number 4
    mt_rand(0, 0x0fff) | 0x4000,

    // 16 bits, 8 bits for "clk_seq_hi_res",
    // 8 bits for "clk_seq_low",
    // two most significant bits holds zero and one for variant DCE1.1
    mt_rand(0, 0x3fff) | 0x8000,

    // 48 bits for "node"
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}
Run Code Online (Sandbox Code Playgroud)

它生成一个VALID RFC 4211 COMPLIANT版本4 UUID.

检查一下:http://en.wikipedia.org/wiki/UUID#Random%5FUUID%5Fprobability%5Fof%5Fduplicates

  • 对于你的UUID,你所做的就是生成一个完全基于`mt_rand()`的非常长的随机数.这将会是没有从做`mt_rand($ largeNumber,$ largerNumber)不同`...你只是增加了一些破折号,使它看起来不像一个很长的数字. (2认同)

小智 39

你可以用这个

use Illuminate\Support\Str;

$random = Str::random(40);
Run Code Online (Sandbox Code Playgroud)


Ner*_*gal 5

2014 年 4 月接受的答案是正确的。它不再准确。2014 年 11 月,有一次提交删除了quickRandom. 由于random_bytes在 PHP 7 中可用,Laravel 慢慢转移到该函数并仅使用该函数而没有任何回退。

ramsey/uuid是 Laravel 中的默认 UUID 库。通过查看代码,我们可以发现默认的随机生成器是RandomBytesGenerator使用random_bytes. 使用相同的方法Str::random

关于 UUID 的维基百科页面对 UUID v4 做了以下说明:

[...] 版本 4 UUID 将有 6 个预先确定的变体和版本位,剩下 122 位用于随机生成的部分,[...]

https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(随机)

128 位 = 122 个随机位 + 6 个版本位。128 位正好是 16 个字节。大多数 UUID 实现读取 16 个字节的随机字节,然后替换指定位置的版本(在 v4 的情况下)。

总而言之,到目前为止,如果您使用Str::random长度等于 16 或Uuid::uuid4(不修改randomGeneratorof Uuid),则几乎相同。