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))));

または、16 進数のダイジェストから:

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

次に、各$base2値を 8 ビットにゼロ パディングし、その内容を内破するだけです。


呼び出しがオーバーフローすることにもbase_convert注意する必要があるため、それに依存しないでください。

もう1つの(かなり重要な)ことは、gmpベース> 10に使用される文字セットが実際には次のとおりであることです。

0123456789A..Za..z

base_convertおよび ハッシュ関数が使用するものとは対照的に:

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

このようstrtoupperに、ハッシュをエンコードしstrtrてデコードするために使用することをお勧めします。

于 2012-07-13T07:32:24.380 に答える