1

我今天检查了sha1的二进制参数,但无法将生成的二进制字符串转换为 base 62 表示。

$str = 'mystring';
echo gmp_strval(gmp_init(sha1($str), 16), 62), PHP_EOL;      // Works
echo gmp_strval(gmp_init(sha1($str, true), 2), 62), PHP_EOL; // Fails
// Same with base_convert()...
echo base_convert(sha1($str), 16, 32), PHP_EOL;              // Works
echo base_convert(sha1($str, true), 2, 32), PHP_EOL;         // Fails

结果:

MNun4i9wmY2M2sBvnq5Z8jDi7nk
0
jjhukjbflgg000000000000000000000
0

我想知道是不是因为gmp_init()base_convert()函数需要一个整数或字符串,而这可能只是二进制数据。

4

1 回答 1

2

@mario 注释是正确的,要将二进制字符串表示形式转换为基数 2,您必须执行以下操作:

$base2 = array_map('decbin', array_map('ord', str_split(sha1($str, true))));

或从十六进制摘要:

$base2 = array_map('decbin', array_map('hexdec', str_split(sha1($str), 2)));

然后您需要做的就是将每个$base2值零填充到 8 位并将其内容内爆。


还值得注意的是,您的base_convert呼叫会溢出,所以不要依赖它。

另一件事(相当重要)是gmp用于 base > 10 的字符集实际上是:

0123456789A..Za..z

与 thebase_convert和 hash 函数使用的相反:

0123456789a..f[g..zA..Z]

我建议你使用strtoupper编码散列和strtr解码它,像这样

于 2012-07-13T07:32:24.380 回答