如何在 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)
我正在尝试将字符串转换为 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)