如何从PHP中获取0-X的加密强整数?

Vil*_*lx- 6 php random

我想在PHP中生成随机的字母数字字符串.它们将用于随机数强度很重要的地方(URL中公开可见的ID等).

据我所知,在PHP中,加密强随机性的主要来源是openssl_random_pseudo_bytes().但是,这会返回一个字节数组,而不是字母数字字符.

要将它们转换为字母数字,我可以哈希它们(这将产生一个有限的十六进制字符集的长度超过必要的字符串),或者base64_encode()它们(它将产生一个字符串+,/并且=在其中 - 不是字母数字).

所以我认为相反,我可以使用随机字节作为熵的来源,并生成我自己的字符串,只包含字符0-9a-zA-Z.

然后问题变成了 - 如何从256个不同的值(输入的一个字节)转换为62个不同的值(输出的一个字符).在某种程度上,所有62个角色的可能性相同.(否则会有8个字符比其余字符更频繁出现).

或许我应该完全使用另一种方法?我希望我的字符串尽可能短(例如,20个字符左右 - 更短的URL更好)并且仅包含字母数字字符(因此不需要在任何地方特别转义).

Nie*_*sol 2

您可以实现自己的 Base64 编码。如果您可以允许使用两个特定符号 - 这些符号可以是任何符号,例如.和-,那么这并不重要。它甚至可以成为其中一个人的空间。无论如何,你会做的是这样的:

$alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-";
// using . and - for the two symbols here
$input = [123,193,21,13]; // whatever your input it, I'm assuming an array of bytes
$output = "";
foreach($input as $byte) {
    $output .= $alphabet[$byte%64];
}
Run Code Online (Sandbox Code Playgroud)

假设随机输入,所有字符出现的概率相等。

话虽这么说,如果您不能允许除纯字母数字之外的任何内容,请从 中删除符号$alphabet并使用%62代替%64。0虽然这确实意味着你对角色有一点偏见7,但我认为这还不足以担心。