我刚刚发现一个有趣的博客,谈论一些面试问题。其中一个问题是:
给定一个非常大的文件(多个TB),检测连续运行程序之间文件中4MB范围的变化。
我对此没有任何线索。任何人都可以对此提出一些想法吗?
答案 0 :(得分:4)
如果您对数据创建有任何控制权,可以使用 Merkle trees
将数据拆分成小片段(假设每个10MB,但这不是问题),并为每个片段创建一个h=hash(fragment)
。
现在,所有这些哈希都将成为树的叶子。现在,从叶子中创建一个完整的二叉树:h(father) = hash(father.left XOR father.right)
。
现在,你已经拥有了一棵树 - 如果比较两棵树,h(root1)= h(root2)当且仅当tree1 = tree2时 - 概率很高(如果使用128位散列,错误的概率是1/2 ^ 128,这实际上可以忽略不计。)
同样的声明对于任何子树当然都是正确的,这使您可以快速找到不同的叶子,并且此叶子代表更改的片段。
Amazon's Dynamo使用这个想法来比较两个数据库是否已更改,并快速找到更改。
答案 1 :(得分:0)
您可以逐字节比较并找出差异。这需要很长时间,但值得一试。
我想到的另一个解决方案是将文件拆分为500 GB并计算md5值并将其与拆分的原始md5值进行比较。一个与原始版本不同,你可以将它分成250 gb并再次比较原始的md5值。而你进一步做到这一点直到你得到4 MB。
类似于具有有限匝数的称重机的硬币问题。