一、代码

上代码:

1
2
3
4
5
6
7
8
9
private function generateOutBizNo($length = 16) {
// 生成一个随机的字节串,长度由参数决定
$randomBytes = openssl_random_pseudo_bytes($length);

// 将字节串转换为十六进制字符串
$result = bin2hex($randomBytes);

return $result;
}

二、解释

下面用不同的方式解释下这样生成的 32 位随机数,重复的概率有多少。

1、方式一

1byte 等于 8bit,例如:11010010
所谓二进制字节,逢二进一,因此每一个 bit 上,不是 0 就是 1,每个 bit 有 2 种可能。
那么 1 个 byte 就有 2^8 = 256 (2的8次方)种可能。
那么 16 个 byte 就有 256^16 种,也就是 (2^8)^16 = 2^128 种可能。

2、方式二

直接看二进制转十六进制的长度为 32 的字符串,
每一个字符都有可能是 0~9、a~f 中的一种 (16种),那么就是 16^32 = (2^4)^32 = 2^128 种可能性。

三、总结

2^128 是一个极大的数,按理说重复的概率几乎可以忽略不计。