我今天检查了sha1的二进制参数,但我无法将生成的二进制字符串转换为基本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()函数需要一个整数或字符串,这可能只是二进制数据。
答案 0 :(得分: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
来电会溢出,所以请不要依赖它。
另一个(相当重要的)是charset gmp
用于base> 10实际上是:
0123456789A..Za..z
与base_convert
和哈希函数使用的内容相反:
0123456789a..f[g..zA..Z]
我建议您使用strtoupper
对哈希进行编码,并使用strtr
对其进行解码,like this。