为简单起见,我的问题是:如何尽快散列字符串(大约200个字符).安全性并不重要,但碰撞是一件大事.
注意:经过快速调查,似乎MurmurHash3可能是最好的选择.我愿意接受任何评论,否则说'
首先,我知道还有很多其他类似的问题,但我还没有找到令人信服的答案.
我有一个对象列表,每个对象包含一个大约3k段的列表,保存到数据库中.每隔X个小时,这些段落都会被重新生成,我需要查找是否有任何段落发生了变化,如果是,则只推送那些新段落.
我发现找到差异的最快方式(知道大部分内容都是相同的)是创建MerkleTree,将其保存到数据库中,并迭代MerkleTree以找出差异,而不是比较段落本身.
在我的情况下,这意味着我将每秒创建数万个哈希值,以与数据库中的内容进行比较.因此,我需要一种非常有效的方法来创建这些哈希.我不关心安全性,我只需要确保碰撞的数量仍然非常低.
Java中可用的最佳算法是什么?
在我的例子中,主要对象由Sections组成,Sections由Languages组成,由Paragraph组成.比较策略是:
1)如果对象哈希相同,则停止,否则转到2)
2)循环所有Section,只保留带有不同散列的Section
3)循环这些部分的所有语言,只保留具有不同散列的语言
4)循环所有这些语言的所有段落,如果哈希值不同,则推送新内容.
我正在阅读有关Cassandra维修的文件,它说
比较从Merkle树的顶部节点开始。如果未检测到差异,则处理进行到左子节点,然后进行比较,然后比较右子节点。
但是,默克尔树的非叶节点表示:
树中较高的每个父节点都是其各自子节点的哈希。由于Merkle树中的较高节点表示数据在树的更下方,因此Casandra可以独立检查每个分支,而无需协调器节点下载整个数据集。
据此,以及我发现的其他数据结构文章,它们都表明只有在两棵Merkle树的根不同的情况下,才进行以下比根深的比较。我不确定文档是否正确描述了我可能理解的问题,或者实际上有错误?
我正在尝试使用 merkletreejs 库测试 merkle 证明,但我不明白为什么它有效
\nconst tree = new MerkleTree(leaves, SHA256)\nconst root = tree.getHexRoot()\nconst leaf = SHA256('a')\nconst proof = tree.getProof(leaf) // \xd0\xa0\xd0\x90\xd0\x91\xd0\x9e\xd0\xa2\xd0\x90\xd0\x95\xd0\xa2\nconsole.log(tree.verify(proof, leaf, root)) // true\nRun Code Online (Sandbox Code Playgroud)\n但这不是吗?
\nconst tree = new MerkleTree(leaves, SHA256)\nconst root = tree.getHexRoot()\nconst leaf = SHA256('a')\nconst proof = tree.getHexProof(leaf)\nconsole.log(tree.verify(proof, leaf, root)) // false\nRun Code Online (Sandbox Code Playgroud)\n