使用 Java 实现云中的重复数据删除
Posted
技术标签:
【中文标题】使用 Java 实现云中的重复数据删除【英文标题】:Data Deduplication In Cloud WIth Java 【发布时间】:2019-06-05 15:23:07 【问题描述】:我正在尝试使用 Java 在云中实现重复数据删除程序。
我不确定如何继续实施。
首先,我想对文件大小、日期和文件名进行简单的文件比较。但是,这是无效的,因为文件可能具有相同的内容但名称不同。
我决定了一个简单的算法,它是 文件上传 -> 文件分块 -> Rabin-karp hashing -> 判断是否可以上传文件。
这样会好还是有什么改进?
我在哪里可以找到更多关于这方面的信息?我曾尝试在互联网上四处寻找,但找不到任何东西。其中大部分只是分解为某些实现,但没有解释或文件分块或 Rabin-karp 散列的详细信息。
我想知道关于这个程序我应该研究哪些 Java 库。
【问题讨论】:
文件有多大?您是否明确需要对块进行分块和散列?为什么一个简单的文件哈希不够用,例如DigestInputStream
?
现在,我想用小文件进行测试,比如比较上传的 pdf 文件与云数据库中的哈希值。这就是为什么我不太确定是否有必要对数据进行指纹识别。
如果不是指纹,什么是散列?真的不清楚你有什么实际问题。
我只是不太确定如何在云存储中实现重复数据删除,我不太确定是否将文件分成更小的字节并获取每个块的哈希值或我可以只获取文件的哈希值并与数据库中现有的哈希值进行比较,
你为什么不确定?换句话说,您认为这两种解决方案都有哪些问题?优点缺点?一个完整的文件哈希甚至校验和几乎总是就足够了——这就是为什么它们被用来验证文件下载。
【参考方案1】:
如果你陈述你的问题限制会更容易。假设如下:
不可分割的最小数据单位是文件 文件相当小,可以放入内存中用于计算哈希 您的文件位于某个云存储桶或您可以将它们全部列出的位置。这也消除了相同的文件名。您可能可以缩小问题范围。
-
使用一些快速散列算法(如基本 CRC 校验和)遍历所有文件中的所有文件并构建映射。 (可以轻松并行化)。
过滤掉所有有冲突的文件。您可以轻松地忽略其余文件,出于所有实际目的,这些文件应该是相当合理的数据块。
使用加密哈希(或最坏的情况,匹配整个文件)运行剩余的文件子集并识别匹配项。
这可以根据基础数据进行细化。
但是,这就是我处理问题并给出结构的方式;这个问题可以很容易地以并行方式划分和解决。请随意详细说明,以便我们能够找到一个好的解决方案。
【讨论】:
所以我要考虑的是是实现文件级重复数据删除还是块级重复数据删除。我不太确定仅获取文件的哈希值并将其放入哈希图中是否就足够了,或者我是否需要将文件分成几个较小的字节并从块中进行重复数据删除。 您的文件大小范围是多少 - 最小值、最大值、平均值?你的块大小是多少?同样,很大程度上取决于要求。如果这是一次性的事情。我不会打扰。对于每天运行的批处理系统,解决方案可能完全不同。 现在,我想在一个小的基础上实现,比如比较上传的 pdf 或文本文件是否在云数据库中重复。这个实施仅适用于最后一年的项目,老实说,我对我应该如何去做有点模糊。一些解决方案建议进行 Rabin-karp 散列,然后将文件分成更小的块,而其他解决方案只建议检查现有的散列值。我会说这是一次性基础,只是为了证明云中重复数据删除的概念。 @ShadowKing 我不确定您所说的“现有哈希值”是什么意思。我能想到的明确分解它的唯一原因是如果文件很大并且计算整个校验和/哈希将是低效的。当然,请注意,如果您将其分解,则必须将这些块的哈希/校验和存储在某处,并且需要对它们进行索引。即使这样,它也可能并不完全足够(哈希冲突虽然很少见,但确实会发生,例如,如果您找到匹配的哈希,则 可能 您有一个重复的文件,但您可能想要检查至少下一个块的哈希值。) 现有的哈希值是指数据库中其他文件的哈希值。我只是不太确定我应该为此学习哪些 Java 库。我看到一些论坛说要研究 Rabin-karp 算法、哈希图或哈希表、messagedigest。以上是关于使用 Java 实现云中的重复数据删除的主要内容,如果未能解决你的问题,请参考以下文章