python-hash()函数

python-hash()函数

python-hash()函数

python内置的hash()函数也是实现set/dict的hash

hash()生成哈希值针对不同解释器进程的值不同,即重新启动python生成哈希又不一样

原因

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默认行为一样)

题外话

set/dict的hash还真就是这个玩意实现的,因为它保证了在同一个解释器进程里相同字符串hash一致。

这个功能有一定的安全性上的考虑,可以让攻击者难以预测内置的set或者dict的一些行为,但远不足以承担真正的密码安全级别的hash的作用。传递set和dict到其他进程的时候,只会传递其中的值,而不会传递hash表结构,hash表是传到之后重新建立起来的。

参考

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

本文作者:朝圣

本文链接:www.zh-noone.cn/2020/2/python-hash()函数

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

shell获取当前路径
0 条评论