如何生成一个 128 位长的字符串?

axs*_*uul 5 php random

基本上,我正在寻找一个函数来执行以下操作

generateToken(128)
Run Code Online (Sandbox Code Playgroud)

这将返回一个由整数或字母字符组成的128 位字符串

澄清:根据评论,我不得不更改问题。显然,如果需要 128 位,我正在寻找一个长度为 16 个字符的字符串。

Cam*_*ner 5

是否有理由必须将字符串限制为整数?这实际上使问题变得更加困难,因为每个数字给你 3.3 位(因为 2^3.3 ~= 10)。以这种方式准确生成 128 位令牌是很棘手的。

更容易的是允许十六进制编码(每个字符 4 位)。然后,您可以生成 128 个真正的随机位,然后以十六进制对它们进行编码,以便在您的应用程序中使用。Base64 编码(每个字符 6 位)对于这种事情也很有用。

openssl_random_pseudo_bytes将为您提供可用于bin2hex编码的随机字节字符串,否则您可以mt_rand在自己的令牌生成例程中使用。

编辑:阅读问题的更新后,您似乎想要生成一个表示 128 位数据的令牌,而实际的字符串长度(以字符为单位)并不那么重要。如果我猜对了您的意图(这是一个唯一 ID,可能用于识别/身份验证目的),那么我建议您使用openssl_random_pseudo_bytes为您的问题生成正确数量的位,在这种情况下为 128(16 字节)。然后,您可以以任何您认为合适的方式对这些位进行编码:十六进制和 base64 是两种可能性。

请注意,十六进制编码将使用 32 个字符来编码 128 位数据,因为每个字符仅编码 4 位 (128 / 4 = 32)。Base64 将使用 22 个字符 (128 / 6 = 21.3)。每个字符占用 8 位存储空间,但只编码 4 或 6 位信息

小心不要将编码的字符串长度与原始数据长度混淆。如果您选择使用字母数字字符 (az, AZ, 0-9) 的 16 字符字符串,则每个字符只能获得 6 位信息(62 的对数基数 2 接近 6),因此您的 16 字符字符串只会编码96 位信息。您应该将您的令牌视为一个不透明的字节数组,并且仅在您实际尝试通过网络发送它或将其放入 cookie 或其他任何内容时才担心将其转换为/从字符串中转换。