php adler32,如何在Python中获得相同的PHP adler32哈希?

我需要生成由

PHP生成的相同adler32哈希,但使用

Python.不幸的是,标准实现不同.有任何想法吗?

$php -r 'print hash("adler32", "bla") . "\n";'

02620130

$python -c 'import zlib; print zlib.adler32("bla");'

39977264

(使用PHP 5.5.9和Python 2.7.6)

目前我已经诉诸

def php_adler32(string):

phpcode = """print hash("adler32", "%s");""" % string

try:

rv = subprocess.check_output(['php','-r',phpcode], shell=False)

except subprocess.CalledProcessError as e:

raise RuntimeError("Could not compute adler32 through php: %s" % e)

return rv

但我害怕最终在dailywtf.com上使用此代码.

最佳答案 简短的回答,pyton以十进制给出结果,PHP以十六进制给出结果.所以如此转换:

php -r 'print hexdec(hash("adler32", "bla")) . "\n";'

应该给你一个与python一致的结果.

更长的答案

adler 32滚动散列由A和B值组成. A值从1开始,并加上模数为65521的字符值.B值从零开始,加上当前A值模65521,所以对于bla我们有:

Character Decimal Adler_A Adler_B

1 0

'b' 98 99 99

'l' 108 207 306

'a' 97 304 610

所以整个字符串的最终adler32 A和B值是Adler_A = 304和Adler_B = 610,当转换为big-endian hex时,Adler_A = 0130和Adler_B = 0262.所以你可以看到PHP的哈希给你一个大的-Andian表示Adler_B,后跟Adler_A,01300262.将此十六进制值转换为十进制给出39977264,这是您从python获得的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值