【发布时间】:2013-11-01 17:25:33
【问题描述】:
我想在 PHP 中生成随机的字母数字字符串。它们将用于随机数强度很重要的地方(URL 中公开可见的 ID 等)。
据我了解,在 PHP 中,加密强随机性的主要来源是 openssl_random_pseudo_bytes()。然而,这会返回一个字节数组,而不是字母数字字符。
要将它们转换为字母数字,我可以对它们进行哈希处理(这将产生一个长度超过必要的一组有限十六进制字符的字符串),或者base64_encode() 它们(这将产生一个带有+、@ 的字符串其中包含 987654324@ 和 = - 不是字母数字)。
所以我认为我可以使用随机字节作为熵源并生成我自己的字符串,该字符串仅包含字符 0-9a-zA-Z。
然后问题就变成了 - 如何将 256 个不同的值(一个字节的输入)转换为 62 个不同的值(一个字符的输出)。在某种程度上,所有 62 个字符的可能性都相同。 (否则会有 8 个字符出现的频率高于其他字符)。
或者我应该完全使用另一种方法?我希望我的字符串尽可能短(比如说,20 个字符左右 - 更短的 URL 更好)并且只包含字母数字字符(这样它就不需要在任何地方特别转义)。
【问题讨论】: