如何从Python生成的哈希值中仅提取数字部分
问题背景
开发需求为基于犬只基础信息生成哈希值存入数据库,在哈希值写入环节遇到数据类型不兼容问题,需要移除哈希值中的所有字母字符,仅保留数字内容。
现有实现代码
import hashlib DogName = 'Dog' DogID = '1' Hash1 = DogName + DogID Hash2 = Hash1.encode('utf-8') out = hashlib.sha1(Hash2).hexdigest() print(out)
运行上述代码生成的SHA1哈希值为:9ef8ed01647767afb5e0c4c45b4c373e73f795c1,需要提取其中的纯数字部分。
实现方案
SHA1的hexdigest()输出是由0-9数字、a-f小写字母组成的十六进制字符串,直接遍历字符串筛选出所有数字字符即可完成提取,该方法无兼容问题,可稳定生效:
import hashlib DogName = 'Dog' DogID = '1' Hash1 = DogName + DogID Hash2 = Hash1.encode('utf-8') out = hashlib.sha1(Hash2).hexdigest() # 筛选所有数字字符拼接 num_only_hash = ''.join(c for c in out if c.isdigit()) print(num_only_hash)
针对示例给出的哈希值,上述代码输出结果为:9801647767504454373737951
注意:仅提取数字的方案会丢失原哈希的部分字符信息,提升哈希碰撞概率。如果是因为数据库字段类型限制无法存储字符串类型的哈希值,更推荐使用无信息损失的整数转换方案,把十六进制哈希直接转为十进制整数存储,不会破坏原哈希的唯一性:
# 无信息损失的整数哈希存储方案 full_hash_int = int(out, 16) print(full_hash_int)
内容的提问来源于stack exchange,提问作者Fumarasee
相关产品推荐
相关产品推荐

