我正在编写一个专门的单元测试工具,需要保存测试结果,以便将来进行比较。因此,我需要能够一致地将传递给每个测试的参数映射到测试结果,从而为每个版本运行测试函数。我希望有一种方法可以对元组进行散列并使用该散列来命名存储测试结果的文件。
我的第一个冲动就是在参数元组上调用hash()
,但当然,由于hash
现在在解释器实例之间随机化,因此无效。
我很难想出一种适用于元组中可能存在的任意元素的方法(我想将它限制为这三者的整数,浮点数,字符串和列表\元组的组合好好地)。有什么想法吗?
我曾想过使用元组的repr
或者腌制它,但是不能保证repr不会为同一输入生成逐字节相同的输出,我不认为酸洗要么(是吗?)
我已经看过this了,但答案都是基于同样的假设,不再适用,并且无论如何都没有真正转化为这个问题,很多讨论都是关于制作hash不依赖于订单商品,我确实希望散列依赖于订单。
答案 0 :(得分:4)
不确定我是否完全理解你的问题,但只是试一试。
在执行哈希之前,只需将结果序列化为JSON字符串,然后对JSON字符串执行哈希计算。
params = (1, 3, 2)
hashlib.sha224(json.dumps(params)).hexdigest()
# '5f0f7a621e6f420002d54ee28b0c169b8112ef72d8a6b60e6a25171c'
如果您的参数是字典,请使用sort_keys = True以确保您的密钥已排序。
params = {'b': 123, 'c': 345}
hashlib.sha224(json.dumps(params, sort_keys=True)).hexdigest()
# '2e75966ce3f1185cbfb4eccc49d5552c08cfb7502a8765fe1dce9303'
答案 1 :(得分:1)
简单测试的一种方法是disable the hash randomization entirely通过在启动脚本的环境中设置PYTHONHASHSEED=0
,例如在bash
中执行:{/ p>
export PYTHONHASHSEED=0