gpt4 book ai didi

php - 如何在 Python 中获取相同的 PHP adler32 哈希?

转载 作者:可可西里 更新时间:2023-10-31 23:30:06 24 4
gpt4 key购买 nike

我需要生成由 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 = 304Adler_B = 610,转换为大端十六进制时是 Adler_A = 0130Adler_B = 0262。因此,您可以看到 PHP 的散列为您提供了 Adler_B 的大端表示,然后是 Adler_A,01300262。将此十六进制值转换为十进制值得到 39977264,这是您从 python 获得的值。

关于php - 如何在 Python 中获取相同的 PHP adler32 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30479267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com