【发布时间】:2013-05-24 22:39:56
【问题描述】:
例如:
>>> a = {'req_params': {'app': '12345', 'format': 'json'}, 'url_params': {'namespace': 'foo', 'id': 'baar'}, 'url_id': 'rest'}
>>> b = {'req_params': { 'format': 'json','app': '12345' }, 'url_params': { 'id': 'baar' ,'namespace':'foo' }, 'url_id': 'REST'.lower() }
>>> a == b
True
为两个字典生成相等哈希的好的哈希函数是什么? 字典将 有 int、list、dict 和 strings 等基本数据类型,没有其他对象。
如果散列是空间优化的,那就太好了,目标集大约是 500 万个对象,因此碰撞机会要少得多。
我不确定 json.dumps 或其他序列化是否尊重平等而不是字典中成员的结构。 例如。使用 dict 的 str 的基本散列不起作用:
>>> a = {'name':'Jon','class':'nine'}
>>> b = {'class':'NINE'.lower(),'name':'Jon'}
>>> str(a)
"{'name': 'Jon', 'class': 'nine'}"
>>> str(b)
"{'class': 'nine', 'name': 'Jon'}"
json.dumps 也不起作用:
>>> import json,hashlib
>>> a = {'name':'Jon','class':'nine'}
>>> b = {'class':'NINE'.lower(),'name':'Jon'}
>>> a == b
True
>>> ha = hashlib.sha256(json.dumps(a)).hexdigest()
>>> hb = hashlib.sha256(json.dumps(b)).hexdigest()
>>> ha
'545af862cc4d2dd1926fe0aa1e34ad5c3e8a319461941b33a47a4de9dbd7b5e3'
>>> hb
'4c7d8dbbe1f180c7367426d631410a175d47fff329d2494d80a650dde7bed5cb'
【问题讨论】:
-
散列字符串化的字典?不知道这是否能保证平等......例如如果它的键(以及它的键的值的键等)将被打印排序
-
-
确实,打印 dict 似乎是以某种方式打印的(但不确定如何)
-
@njzk2 我猜这个顺序是不确定的,
-
有趣,显然它是平台相关的
标签: python