【发布时间】: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