如何让Python3生成与MariaDB一致的SHA1哈希值?
为什么Python生成的SHA1哈希与MariaDB结果不一致?
问题核心在于MariaDB的sha()函数和Python哈希方法的返回值类型差异:
- Python中
hashlib.sha1(column_str.encode()).hexdigest()生成的是SHA-1哈希的十六进制字符串(40个字符)。 - MariaDB的
sha()函数返回的是SHA-1哈希的二进制原始值(20字节),将这个二进制值存入char(40)列时,MariaDB会按当前字符集把每个字节解析为字符,最终得到的字符串和Python的十六进制结果完全不匹配。
注:你使用的concat_ws(',', 'one', 'two', 'three')与Python的','.join(columns)生成的字符串内容一致,这部分无问题。
解决方法
有两种方案可让两边结果对齐:
- 修改MariaDB列定义,改用
sha1()函数sha1()函数直接返回SHA-1哈希的十六进制字符串(40字符),与Python的hexdigest()输出格式完全匹配:
hash char(40) GENERATED ALWAYS AS (sha1(concat_ws(',', 'one', 'two', 'three'))) STORED;
- 保留
sha()函数,将二进制结果转为十六进制
通过hex()函数把sha()返回的二进制值转换为十六进制字符串:
hash char(40) GENERATED ALWAYS AS (hex(sha(concat_ws(',', 'one', 'two', 'three')))) STORED;
若要反向让Python生成与原MariaDBsha()结果一致的内容,可使用hashlib.sha1(column_str.encode()).digest()获取二进制哈希值,再按对应字符集转成字符串,但这种方式可能包含不可打印字符,不适合存储为char(40)列,因此更推荐前两种方案。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

