You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将不同顺序的JSON列表规范化为相同哈希值?

问题与解决方案

给定两个JSON对象:

first = {"number": 1, "color": "blue"}
second = {"number": 2, "color": "red"}

以及两个仅列表元素顺序不同的JSON结构:

{"list": [first, second]}
{"list": [second, first]}

使用符合RFC8785标准的Python库做规范化时,因该标准保留数组元素顺序,导致两者哈希值不同。要让它们生成相同哈希值,需对数组元素做预处理,具体方法如下:


核心思路

RFC8785规范本身会保留JSON数组的顺序(因为JSON数组属于有序集合),所以要实现“顺序无关”的哈希,必须先对数组内的元素做可排序的规范化处理,再基于排序后的数组做最终的规范化与哈希计算。

具体实现(Python示例)

方法一:重构排序后的JSON再规范化

from json_canonicalization import canonicalize
import hashlib

# 定义原始对象
first = {"number": 1, "color": "blue"}
second = {"number": 2, "color": "red"}

def get_sorted_canon_hash(json_data):
    # 提取列表元素并逐个规范化
    canon_elements = [canonicalize(item) for item in json_data["list"]]
    # 对规范化后的字符串按字典序排序
    sorted_canon_elements = sorted(canon_elements)
    # 将排序后的元素重新解析为JSON对象,构造新的JSON结构
    sorted_list = [canonicalize(elem, parse=True) for elem in sorted_canon_elements]
    sorted_json = {"list": sorted_list}
    # 对新JSON做最终规范化,计算SHA256哈希
    final_canon = canonicalize(sorted_json)
    return hashlib.sha256(final_canon.encode()).hexdigest()

# 测试两个目标JSON
json_a = {"list": [first, second]}
json_b = {"list": [second, first]}

hash_a = get_sorted_canon_hash(json_a)
hash_b = get_sorted_canon_hash(json_b)
print(hash_a == hash_b)  # 输出:True

方法二:直接基于排序后的规范化字符串计算哈希

如果不需要保留JSON结构,也可以直接拼接排序后的元素规范化字符串来计算哈希,步骤更简洁:

from json_canonicalization import canonicalize
import hashlib

def get_order_insensitive_hash(json_data):
    # 对列表内每个元素做规范化,得到字符串列表
    canon_elements = sorted(canonicalize(item) for item in json_data["list"])
    # 拼接成统一格式的字符串
    combined_str = '[' + ','.join(canon_elements) + ']'
    # 计算哈希
    return hashlib.sha256(combined_str.encode()).hexdigest()

# 测试
hash_a = get_order_insensitive_hash({"list": [first, second]})
hash_b = get_order_insensitive_hash({"list": [second, first]})
print(hash_a == hash_b)  # 输出:True

关键注意事项

  1. 必须先对数组元素单独做规范化:确保相同的JSON对象生成完全一致的字符串,排序才有意义。
  2. 基于规范化后的字符串排序:不能直接对原始Python字典排序,因为字典的内部顺序可能和RFC8785的规范化顺序不一致。
  3. 优先使用安全哈希算法:建议用hashlib的SHA256/SHA512等算法,避免使用Python内置的hash()函数(该函数的结果会随Python版本、运行环境变化)。

内容的提问来源于stack exchange,提问作者valeesi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:42:16