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
小智 39
你可以用这个
use Illuminate\Support\Str;
$random = Str::random(40);
Run Code Online (Sandbox Code Playgroud)
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),则几乎相同。
| 归档时间: |
|
| 查看次数: |
56379 次 |
| 最近记录: |