python hash 不一致踩坑总结

背景

在线上的一次模型对照实验中,发现对同一个用户进行 hash 分流时,会生成不同的 random 值,导致实验数据污染

原因

参考:https://www.zhihu.com/question/57526436

python 的字符串 hash 算法并不是直接遍历字符串每个字符去计算 hash,而是会有一个 secret prefix 和一个 secret suffix,可以认为相当于是给字符串加盐后做 hash,可以规避一些规律输入的情况

参考:https://blog.csdn.net/qq_27093891/article/details/122585391

在 3.x 中修改了默认行为,如果你不配置环境变量,则默认是随机一个前后缀值,这样每次启动都会不同,这个环境变量是PYTHONHASHSEED,无论在2.x还是3.x中,配置为一个正整数,将作为随机种子;配置为0,则secret前后缀默认清零(和2.x默认行为就一样了),配置为空串或“random”,则表示让进程随机生成

简单说就是,不同 session 的不同 hash 随机种子导致了对于同一个值的 hash 不一致

解决

参考:https://cloud.tencent.com/developer/article/1873941
参考:https://blog.csdn.net/weixin_36149892/article/details/120297930

import hashlib


# 返回 string 的 1~2 的 hash 值
def get_md5_num(username):
    md5_machine = hashlib.md5()
    md5_machine.update(username.encode('utf-8'))
    md5_hash_string = md5_machine.hexdigest()
    md5_hash_num = int(md5_hash_string, 16) % 2 + 1
    return md5_hash_num

需要注意的一个问题:

Update the md5 object with the string arg. Repeated calls are equivalent to a single call with the concatenation of all the arguments: m.update(a); m.update(b) is equivalent to m.update(a+b).

如果重复使用对象(也就是将 md5_machine = hashlib.md5() 放到函数外的话),第二次产生的哈希码实际上是和两次字符串拼接所产生的结果,因此,需要将 md5_machine = hashlib.md5() 放到函数内,每次都重新创建,即可保证结果一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值