从 python 程序中禁用哈希随机化

2023-12-03

从Python 3.3开始,哈希算法是非确定性的salted以避免某种攻击。这对于网络服务器来说很好,但在尝试调试程序时却很痛苦:每次运行脚本时,字典内容都会以不同的顺序迭代。

一些早期版本的 python 有一个-R标记为enabling哈希随机化,但现在它是默认行为,该标志尚未被其相反的状态所取代。 可以通过设置环境变量来禁用随机化PYTHONHASHSEED:

Python哈希种子

如果此变量未设置或设置为随机,则使用随机值作为 str、bytes 和 datetime 对象的哈希值的种子。
如果 PYTHONHASHSEED 设置为整数值,则它将用作生成哈希随机化所涵盖的类型的 hash() 的固定种子。

问题是这个变量必须在启动 python 进程之前设置。我尝试将其设置为os.putenv(), or in os.environ,但是这些似乎对哈希方法没有影响。这并不奇怪:我不希望 python 在每个集合或字典查找之前检查环境!所以,问题依然存在:

python 程序有没有办法禁用自己的哈希随机化?


不幸的是,我怀疑这是不可能的。看着test_hash.py the HashRandomizationTests类及其后代被添加到引入此行为的提交。他们通过修改环境并启动一个新进程来测试哈希行为PYTHONHASHSEED明确设定。也许你可以尝试复制这种模式。

我也刚刚注意到你说“每次我运行脚本时,字典内容都会以不同的顺序迭代。“ - 我想你知道collections.OrderedDict, 正确的?这是获得可靠的哈希迭代的正常方法。


如果您愿意在 shell 环境中设置该值,您也可以将 python 调用包装在 bash 脚本中,例如

#! /bin/bash
export PYTHONHASHSEED=0

# call your python program here

只要您可以使用包装脚本,就可以避免操作整个环境。

或者甚至只是在命令行上传递值:

$ PYTHONHASHSEED=0 python YOURSCRIPT.py
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 python 程序中禁用哈希随机化 的相关文章

随机推荐

  • 在 HTML 代码中的何处插入 JavaScript 库和 CSS?

    我对 Web 开发不太陌生 当我在互联网上搜索其他主题时 我看到很多人将流行的 JS 库放在他们网站的不同地方 例如 在 上插入 JS 库非常开始或开始 部分 在加载任何 JS 代码或 CSS 文件之前 例如 在 上插入 JS 库结束了 部
  • 如何为spark-submit添加资源jar?

    我的spark应用程序依赖于adam 2 11 0 20 0 jar 每次我都必须将我的应用程序与adam 2 11 0 20 0 jar打包为fat jar以提交到spark 例如我的fat jar是myApp1 adam 2 11 0
  • 以编程方式运行 MSBuild

    我正在尝试以编程方式执行 MSBuild 但无法执行以下命令 string command string Format C Windows Microsoft NET Framework v4 0 30319 msbuild exe 0 1
  • 如何使用 Jersey 2 测试框架为此类编写单元测试

    我正在尝试为 Rest api 调用编写单元测试 该调用具有 POST 方法 用于使用 Jersey2 将视频文件添加到基于 Web 的应用程序 这是我的类方法的签名 TemplateController java 我想为其编写单元测试 P
  • Hibernate MSSQL datetime2 映射

    我有一个存储过程 它返回数据库中数据类型为 datetime2 Java 文件中数据类型为 Date 的列 当我尝试对从数据库获取的时间调用 getTime 时 它返回 19994321211 毫秒 相当于 IST 2015 年 5 月 4
  • 如何使用 fwrite 将结构写入文件?

    我对 C 很陌生 并且在使用 fwrite 时遇到了麻烦 我正在寻找使用一个包含两个值的结构 struct keyEncode unsigned short key 2 unsigned short encoded 2 然后我在 main
  • 如何使用 Jax-RS 返回 Java List Json

    我想知道如何让方法返回 List 的 JSON 数组 例如 GET Produces application json public List
  • 使用 SQLAlchemy 表达式时 Dask read_sql_table 出错

    我正在尝试将 SQLAlchemy 表达式与 dask 的 read sql table 结合使用 以获取通过连接和过滤几个不同表创建的数据集 这文档表明这应该是可能的 下面的示例不包含任何联接 因为不需要它们来复制问题 我构建连接字符串
  • Facebook JS 影响 IE 中的 CSS/@font-face?

    我似乎注意到 Facebook 的 JS div div 似乎影响了我网站在 IE 中的 CSS 例如 假设标题使用 font1 正文使用 font2 有时 在 IE 中 所有字体都使用 font1 甚至交换 标题使用 font2 正文使用
  • 运行 selenium 时如何将参数传递给 google chrome?

    我希望能够在运行 selenium 时将参数传递给 google chrome 我怎样才能做到这一点 当我运行 selenium 时 我使用 Java 命令 Java jar selenium jar 如何将 no sandbox igno
  • 如何从 iOS 应用程序中将视频上传到 YouTube? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 在我的 iOS 应用程序中
  • 如何使用 python 从包含数千个文件的目录中复制前 100 个文件?

    我有一个巨大的目录 并且一直在更新 我试图使用 python 仅列出目录中最新的 100 个文件 我尝试使用 os listdir 但是当目录大小接近 1 00 000 个文件时 listdir 似乎崩溃了 或者我没有等待足够长的时间 我只
  • HashMap 中的键是否存在检查

    检查 HashMap 中的键是否存在总是必要的吗 我有一个包含 1000 个条目的 HashMap 我正在考虑提高效率 如果HashMap的访问非常频繁 那么每次访问时都检查键是否存在将导致很大的开销 相反 如果密钥不存在并因此发生异常 我
  • 如何在 ASP.NET MVC 中禁用会话状态?

    我想要一个非常轻量级的 ASP NET MVC 站点 其中包括删除尽可能多的常用 HttpModule 并禁用会话状态 但是 当我尝试执行此操作时 出现以下错误 The SessionStateTempDataProvider requir
  • 如何在 PHP 中第 n 次出现针时分割字符串?

    必须有一种快速有效的方法来在针的 第 n 次出现处分割 文本 字符串 但我找不到它 里面的功能还是比较齐全的PHP手册中的strpos注释 但这对于我的需要来说似乎有点多了 我有纯文本作为 string并想将其拆分为nth的发生 needl
  • 构造函数 ProcessBuilder(String, String, String) 未定义

    在同一个 IDE Eclipse 中 我有两个项目都有 ProcessBuilder builder new ProcessBuilder cmd exe c command 但在项目一中它没有显示编译错误 但在项目二中它显示编译错误两个
  • 在 Qt 中处理非常大的图像

    我无法让 Qt 处理超过 10 000X10 000 的图像 我正在处理每张大约 2GB 的巨大卫星图像 我考虑过使用内存映射 但图像仍然占用内存空间 QFile file c qt a ras file open QIODevice Re
  • python webbrowser.open(url)

    httpd make server 80 server webbrowser open url httpd serve forever 这可以跨平台工作 除非我在 putty ssh 终端上启动它 我如何欺骗控制台在单独的进程中打开 w3m
  • 为什么原始 numpy 数组在更改从它创建的另一个数组时会发生变化?

    我有一个 numpy 数组r当我用来创建另一个数组时r2从中取出并转动该新阵列r2为零它也改变了原始数组r 我搜索了类似的问题 但没有找到任何令人满意的答案 所以请考虑提出一个合适的答案 原始数组 gt gt gt r array 0 1
  • 从 python 程序中禁用哈希随机化

    从Python 3 3开始 哈希算法是非确定性的salted以避免某种攻击 这对于网络服务器来说很好 但在尝试调试程序时却很痛苦 每次运行脚本时 字典内容都会以不同的顺序迭代 一些早期版本的 python 有一个 R标记为enabling哈