【问题标题】:Hashing object hierarchy散列对象层次结构
【发布时间】:2021-02-02 04:43:30
【问题描述】:

尝试实现我自己的对象层次结构散列。类似于object-hash,但更简单。

要求:

  • 支持对象和数组的简单层次结构
  • 支持各种原语,例如数字、字符串、布尔值等
  • 独特的哈希摄取

应该很简单,但我正在努力解决最后一个要求。给定一个对象,例如

{ a: { x: 'b' } }

我们可以使用pre-order traversal as 来散列它

crypto
  .createHash('sha1')
  .update('object')
  .update('a')
  .update('object')
  .update('x')
  .update('string')
  .update('b')
  .digest()
  .toString('base64')
// => CWrPyn7XLM4k/uDGnDCqqDv3Iy0=

但是这会产生与

相同的哈希值
{ aobjectx: 'b' }

crypto
  .createHash('sha1')
  .update('object')
  .update('aobjectx')
  .update('string')
  .update('b')
  .digest()
  .toString('base64')
// => CWrPyn7XLM4k/uDGnDCqqDv3Iy0=

我们可以使用分隔符并在任何地方对其进行转义,但这需要相当多的搜索和替换,所以也许有更有效的方法。

如果我们将前序和后序结合起来,以这种方式引起冲突似乎要困难得多。但是我不确定是否仍然无法构造碰撞。

使用JSON.stringify 会起作用,但我有性能问题,它不适用于边缘情况,例如undefined.

我查看了对象哈希的code,但不确定他们是否正在处理这个问题。

寻找建议以使其可行性能。理想情况下,有一些数学证明表明无法构造类似于上面的碰撞。

感谢您的帮助!

【问题讨论】:

  • 一个人可以总是构造一个哈希冲突,你只是不应该这么容易做到。
  • @Bergi 绝对。刚刚改进了我问题中的措辞。问题是哈希摄取是相同的,这不应该发生
  • 您已经正在使用分隔符:object。是的,您需要正确地转义它,或者使用不太可能作为值的一部分出现的一个。不,转义不需要搜索和替换,只需拆分,并将各个部分传递给update

标签: javascript json algorithm hash traversal


【解决方案1】:

听起来你真的只是想要这个:

crypto.createHash('sha1').update(JSON.stringify({ a: { x: 'b' } })).digest().toString(base64)

这将比您编写的任何其他代码执行得更好,但是对象中的键可以按任何顺序出现,因此您可以获得等效对象的不同哈希值。

解决此问题的一种方法是将每个对象(包括列表)转换为列表,以便您可以对键进行排序,例如:

{b: 1, a: 2} -> ["O", "a", 2, "b", 1]
["a", 2, "b", 1] -> ["L", "a", 2, "b", 1]

【讨论】:

    【解决方案2】:

    给你的数据添加一些后缀,哈希值会不一样:

    crypto
      .createHash('sha1')
      .update('object'+"#")
      .update('a'+"#")
      .update('object'+"#")
      .update('x'+"#")
      .update('string'+"#")
      .update('b'+"#")
      .digest()
      .toString('base64')
    
    crypto
      .createHash('sha1')
      .update('object'+"#")
      .update('aobjectx'+"#")
      .update('string'+"#")
      .update('b'+"#")
      .digest()
      .toString('base64')
    

    【讨论】:

    • 但是你仍然可以用同样的方式轻松构建碰撞​​。所以这并不能解决任何问题。还是我错过了什么?
    • 不,使用疯狂的废话后缀,就是这样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多