我想在 PHP 中生成随机的字母数字字符串。它们将用于随机数强度很重要的地方(URL 中公开可见的 ID 等)。
据我了解,在 PHP 中,加密强随机性的主要来源是openssl_random_pseudo_bytes()
. 然而,这会返回一个字节数组,而不是字母数字字符。
要将它们转换为字母数字,我可以对它们进行散列(这将产生一个长度超过必要的一组有限十六进制字符的字符串),或者base64_encode()
它们(这将产生一个带有+
,/
和其中的字符串=
- 而不是字母数字)。
所以我认为我可以使用随机字节作为熵的来源,并生成我自己的仅由 characters 组成的字符串0-9a-zA-Z
。
那么问题就变成了——如何将 256 个不同的值(输入的一个字节)转换为 62 个不同的值(输出的一个字符)。在某种程度上,所有 62 个字符的可能性都相同。(否则会有 8 个字符出现的频率高于其他字符)。
或者也许我应该完全使用另一种方法?我希望我的字符串尽可能短(例如,20 个字符左右 - 较短的 URL 更好)并且只包含字母数字字符(因此它不需要在任何地方特别转义)。