8

Merkle 树(又名哈希树)用于“Cassandra”和“Dynamo”中的数据同步。

与任何散列函数一样,不同的数据有可能具有相同的散列值:

存在 x 和 y,其中 [y!=x] 但 [hash(x) = hash(y)]

随着 NOSQL 中“大数据”的增长,遇到此类数据的概率也越来越高。

这意味着随着数据集变得越来越大,几乎可以肯定 Merkle 树中的不同节点将产生相同的父哈希。

在这种情况下,当集群中的两台不同的机器遍历它们的默克尔树时,它们会得到一个误报,认为它们的数据是一致的。如果没有更多数据写入树的该分支,则机器将永远保持不同步。

这是如何处理的?

4

1 回答 1

6

大多数系统不处理这个。为什么?因为具有相同哈希值的两个不同输入的概率非常非常低。使用良好的哈希函数(我认为您正在使用),这应该接近 1/2^{hash-bits}。并且由于用于这些目的的大多数哈希至少有 128 位长,因此您得到这种冲突的概率为 1/2^128。大约是 2.9387359e-39 (0.{38 zeroes}29387359)。

使用 160 位散列(这些系统中的大多数使用 SHA-1 散列)就足够了,当您的数据库中的对象与世界上的沙粒一样多时。你仍然有不到 1/2 的概率会发生这样的碰撞。因此,我不会担心发生碰撞的情况。发生这种情况的概率,实在是太低了。

于 2013-01-07T14:01:16.130 回答