3

私は md5hash 関数を php から python3.2 に書き直そうとしていますが、それは誤りです:

phpコード:

function MD5Hash($str) {
    $m = md5($str);
    $s = '';
    foreach(explode("\n", trim(chunk_split($m, 2))) as $h) {
        $s .= chr(hexdec($h));
    }
    return $s;
}

およびpythonコード:

def md5hash(self, st):
    m   = hashlib.md5(st).hexdigest()
    print(str(st) +" : "+m)
    s   = bytes()
    for i in range(0, len(m), 2):
        s   += chr(int(m[i:min(i+2, len(m))], 16)).encode('utf-8')
    return s

私は試しています

PHP:

echo(base64_encode(MD5Hash(MD5Hash("123123"))));
result: KXJU6b/guPOcaC7aMLub4A==

パイソン:

print(base64.b64encode(self.md5hash(self.md5hash(b"123123"))))
result: fcOsw6VSwo5iHEvCjz98w7JMW09w

私はそれを修正する方法がわかりません、私を助けてください:(

4

1 に答える 1

4

binascii.unhexlifyを使用します。

import base64
import hashlib
import binascii

def md5hash(st):
    m = hashlib.md5(st).hexdigest()
    # print(str(st) +" : "+m)
    s = binascii.unhexlify(m)
    return s

print(base64.b64encode(md5hash(md5hash(b"123123"))))

収量

KXJU6b/guPOcaC7aMLub4A==

ところで、元の計算を台無しにしたのは、Unicode への変換とバイトへの変換でした。でエンコードするとutf-8、一部の Unicode が 2 バイトに変換されます。意図したとおりにバイトをパックしていませんでした。(次の値を追跡する print ステートメントを挿入します。

chr(int(m[i:min(i+2, len(m))], 16)).encode('utf-8')

とすれば、私の言いたいことがわかるはずです。)binascii.unhexlifyはコーディングが高速で簡単ですが、ほとんどのコードを救う 1 つの方法は、bytearray を使用することです。

def md5hash(st):
    m = hashlib.md5(st).hexdigest()
    s = bytearray([int(m[i:min(i+2, len(m))], 16) for i in range(0, len(m), 2)])
    return s
于 2013-03-30T01:33:34.717 に答える