[https://www.cnblogs.com/yzhch/p/11855660.html]
在同一个程序运行过程中,单进程下,hash同一个字符串,结果是否一致。 答案:一致
在同一个程序运行过程中,多进程中,不同子进程hash同一个字符串,结果是否一致。答案:一致
同样的代码,多次运行同一个程序,每次运行程序时,hash同一个字符串,产生的结果和其他运行过程产生的结果是否一致。答案:不一致
[https://www.zhihu.com/question/57526436/answer/153241020]
python的字符串hash算法并不是直接遍历字符串每个字符去计算hash,而是会有一个secret prefix和一个secret suffix,可以认为相当于是给字符串加盐后做hash,可以规避一些规律输入的情况显然这个secret前后缀的值会直接影响计算结果,而且它有一个启动时随机生成的机制,只不过,在2.x版本中,这个机制默认是关闭的,前后缀每次启动都设置为0,除非你改了相关环境变量来要求随机,而在3.x中修改了默认行为,如果你不配置环境变量,则默认是随机一个前后缀值,这样每次启动都会不同这个环境变量是PYTHONHASHSEED,无论在2.x还是3.x中,配置为一个正整数,将作为随机种子;配置为0,则secret前后缀默认清零(和2.x默认行为就一样了),配置为空串或“random”,则表示让进程随机生成(和3.x默认行为一样)具体为啥要这么做,猜测一个是为了安全性(防字符串hash表的攻击,比如php曾经碰到的攻击),另一个可能也是强调不要依赖一些内建结果,因为这种算法可能随着版本而更新,避免有些用户不看文档,误以为是永远不变的
思考?
在k8s 程序中,每个 job用hash分桶取数据,是否正确?
不一致,需要在dockerfile 中添加一行:
ENV PYTHONHASHSEED=0