如何在 Python 中执行 PHP 的 (int)(hexdec(getFirstNchars(sha1($sfld), 8)))?

How to do PHP's (int)(hexdec(getFirstNchars(sha1($sfld), 8))) in Python?

我正在尝试将字符串转换为 SHA1 校验和,which is what is used in Anki's csum field

sfld: 'Bonjour' - Card front content without html (first part of flds, filtered).

csum: 4077833205 - A string SHA1 checksum of sfld, limited to 8 digits. PHP: (int)(hexdec(getFirstNchars(sha1($sfld), 8)))

所以我想在这里做的是转换字符串 Bonjour 并得到 4077833205.

然而,尽管我尝试了以下 this post,但我无法获得正确的值。

int(hashlib.sha1(b"Bonjour").hexdigest(), 16) % (10**8) # 48831164

abs(hash(s)) % (10 ** 8) # 70576291

而且数字也不匹配,csum值是10位,虽然文档说是8位。所以我觉得我理解错了。

我检查了我的 Anki 数据库,发现 csum 列的值是 7 到 10 位数字,虽然 10 位数字是最常见的。

我的问题是,PHP 的 (int)(hexdec(getFirstNchars(sha1($sfld), 8))) 在 Python 中的等价物是什么?为什么上面的答案与正确的值不匹配?

您在 python 中用来缩短长度的 mod 函数放错了地方。它发生得太晚了。

php 代码执行 sha1,将返回的十六进制字符串截断为 8 个字符,然后将该值转换为十进制。您的 python 代码执行顺序错误。它执行 sha1,将整个结果转换为小数,然后将其切成 8 个字符(使用 mod)。

您的 php 代码的 python 等效为:

int(hashlib.sha1(b"Bonjour").hexdigest()[:8],16)