在 JavaScript 和 Python 中,一致散列受限于 JSON 可表示内容的对象/字典的最佳方法是什么?用多种不同的语言呢?
当然,有许多不同语言一致实现的散列函数采用字符串,但要对对象进行散列,您必须先将其转换为字符串表示形式。
我想要一个哈希函数,它将始终为任何语言的同一字典返回相同的值,但 JSON 规范不保证序列化表示中键的顺序。
json.dumps()
和 JSON.stringify()
的行为是否相同?您将如何验证这一点?
如果没有,是否有一种序列化格式包含多种语言的库(我对 Python 和 JavaScript 实际上很感兴趣,但也对所有语言都很好奇)不需要调用者进行任何额外处理来产生一致的结果?
我会把它分成两个问题。
- 如何在 JavaScript 和 Python 中获得相同的序列化字符串?
- 您应该使用哪个字节数组散列函数?它必须是在 JavaScript 和 Python 中具有相同实现的既定算法。
使用(1)获取两个字符串,然后UTF8编码,然后使用(2)获取哈希。
由于 (2) 很简单,我将只解决 (1)。
确保您生成的两个 JSON 字符串相同的问题有多个方面。
- 您需要使用未格式化的 JSON(没有多余的空格、制表符或换行符)。
- 空值必须被同等对待。如果值为 null,某些序列化程序将默认丢弃字典键值对。
- 字典中键值对的顺序必须一致。
- JSON 数字序列化应该是一致的。例如,您不能将整数 1 在一侧序列化为
1
而在另一侧序列化为 1.0
。 (但这可能不是什么大问题。)
- 两者的字符串编码应该相同。 JSON 允许序列化为 Unicode 文本,只要求
"
和 \
在 JSON 字符串中进行反斜杠转义。然而,大多数序列化程序做的比必要的更多,并且减少了几乎所有 Unicode 字符到 \uXXXX
等效项。有关 JSON 字符串编码的详细信息,请参阅 json.org。消除所有歧义的一种方法是仅在绝对必要时才转义。
您需要确保所有这些都在 JavaScript 和 Python 之间匹配。我使用的大多数 JSON 序列化库都为我在上面的列表中提到的所有内容提供了配置 Hook 。不幸的是,我对 JavaScript 或 Python 库不是很熟悉。
我是一名优秀的程序员,十分优秀!