PHP で sha1 や md5 などのハッシュ値の長さを参照する場合、リテラルに存在する文字数ではなく、メモリ内のハッシュのサイズとして解釈するのは正しいですか?
3 に答える
はい、そうです。ただし、そのサイズは文字列内の文字数と密接に関係しています。生の文字列を取得すると、8 ビットあたり 1 文字になります。16 進数を取得する場合 (デフォルト)、4 ビットごとに 1 文字を取得します。
セキュアハッシュ関数の主な出力は常にビットで定義されます。したがって、ハッシュ関数の出力を参照する場合、暗号学者は常に、たとえば、壊れたMD5アルゴリズムの場合は128ビット、SHA1の場合は160ビット、SHA-256の場合は256ビットについて話します。
ただし、ほとんどの暗号化APIはバイトでのみ機能します。これは、ハッシュサイズを示す特定のメソッドが存在する場合、多くの場合、バイト単位のサイズが返されることを意味します。したがって、上記のアルゴリズムの場合、16、20、および32バイトになります。
もちろん、バイトは16進数で返されるため、文字列の文字数はその2倍になります。文字列の長さは、32、40、または64文字を返す必要があります。それが同じバイト数に変換されるかどうかは、文字エンコードによって異なります(たとえば、UTF-16を使用するとバイト数が2倍になります)。
ハッシュ関数には大きな内部状態があるため、実行中の実装が取得するバイト数は、出力のビット数よりもはるかに多くなります。しかし、最近のPCで気付くほど高くはありません。
これは、ハッシュを明確に格納するために必要な最小ビット数です。
>>> len(hashlib.md5('foo').digest()) * 8
128
>>> len(hashlib.sha1('foo').digest()) * 8
160
>>> len(hashlib.sha512('foo').digest()) * 8
512