【问题标题】:How to fix the order of dictionary handling in Python 3?如何修复 Python 3 中字典处理的顺序?
【发布时间】:2015-03-26 09:54:06
【问题描述】:

有没有办法在 Python 3 中可靠地修复字典处理的顺序,即以可预测的顺序对键和值建立迭代?

出于调试目的和重现故障,据说是基于 python 3.3 和 3.4 中的字典访问,我需要以某种方式使对字典的迭代可预测。我的意思是我想修复在 Python 程序开始时执行任何迭代的方式。这样多次启动程序,对dict.items()dict.keys()dict.values() 的调用总是产生相同的元素顺序。更重要的是,最好通过设置散列函数的某种种子值来更改此顺序。我该怎么做?

这仅用于调试,我不想也不能使用sorted(dict.keys())OrderedDict 之类的东西。谢谢!

【问题讨论】:

    标签: python dictionary hash python-3.3 python-3.4


    【解决方案1】:

    你应该看看PYTHONHASHSEED 环境变量:

    https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED

    将其设置为固定整数,然后您的哈希种子是确定性的。

    【讨论】:

    • 只要确保你不在生产环境中这样做。
    • 好吧,如果你把它设置为一个没人知道的秘密值,我不认为这是一个大问题。
    • 不,这没有抓住重点。它之所以是随机的,是为了防止各种依赖于可预测的 dict 排序的攻击;例如,here 描述的那种 DoS 攻击。
    • 我想每个人都同意防止 DoS 攻击是随机的。我不太同意“默默无闻的安全”论点:如果该论点可以被认为是有效的,那么使用公钥密码术也将被归类为“默默无闻的安全”,就好像有人知道私钥一样,你怎么办知道是否有人else 知道吗? PYTHONHASHSEED 的值必须使用与保护私钥相同的注意方式进行保护。但我同意,随机值是最好的。
    • 别担心,这只是为了调试。环境变量仅在我的 PyCharm 运行配置中设置,其他任何地方都没有:-D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2018-08-05
    • 2018-12-12
    • 2015-10-21
    • 2019-09-21
    • 2019-09-14
    • 2013-12-27
    相关资源
    最近更新 更多