Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从文件中查找重复的1kb块_Java_File_Hash - Fatal编程技术网

Java 从文件中查找重复的1kb块

Java 从文件中查找重复的1kb块,java,file,hash,Java,File,Hash,TL;DR:如何从一个文件中识别出重复的、不重叠的1kb块,这个文件很大,也可以是二进制文件? 我最近在《挑战》中遇到了这个问题。 我们得到了一个文件名。此文件的大小将是1kb的倍数。我们必须对此文件执行重复数据消除操作,并将修改后的内容写入另一个文件。重复数据消除操作会从文件中查找并删除重复的、不重叠的1kb数据块。该文件可以是非常大的文件,也可以是二进制文件。 问题的第二部分涉及反转重复数据消除操作并从重复数据消除文件重新生成原始文件 我的方法:我尝试使用Adam Horwath博客中建议

TL;DR:如何从一个文件中识别出重复的、不重叠的1kb块,这个文件很大,也可以是二进制文件?
我最近在《挑战》中遇到了这个问题。
我们得到了一个文件名。此文件的大小将是1kb的倍数。我们必须对此文件执行重复数据消除操作,并将修改后的内容写入另一个文件。重复数据消除操作会从文件中查找并删除重复的、不重叠的1kb数据块。该文件可以是非常大的文件,也可以是二进制文件。
问题的第二部分涉及反转重复数据消除操作并从重复数据消除文件重新生成原始文件


我的方法:我尝试使用Adam Horwath博客中建议的哈希。我计算了每个1kb字节数据的哈希值,并将其存储在一个哈希表中,哈希值作为键,块的索引作为值。下面是我计算1kb数据哈希的代码(类似于博客中的inithash):

//实现Rabin-Karp算法中使用的哈希
//p^n*a[x]之和
//hconst=69069//mod 2^32的良好乘数;
公共静态长计算哈希(int[]数据,int chunkSize){
长散列=1;
for(int i=0;i
我的理解或实现有问题(显然),没有给出正确的结果。我的问题是:

  • 散列方法识别重复块是否正确?(比较每个字节是一个代价高昂的过程)
  • 有没有更好的方法来识别重复块

    • 有没有比核心哈希表更好的方法?对尤其是当输入文件大于RAM时

      您解释说您有大量的1kib文档和大量的文件段。通过读取每个段并将每个段的一行写入包含两列的临时
      segments.txt
      文件,对其进行预处理。第一列具有段内容的副本,或内容的SHA224哈希。第二列有段索引号,这是一个以零开始的序列号。可以随意使用散列的前几个字节,这取决于您对散列冲突的敏感性


      现在使用
      /usr/bin/sort
      (核心外合并排序)创建
      段\u sorted.txt
      。在这一点上,您的问题是微不足道的。只需读取每一行,同时记住前面的散列。如果cur\u hash==prev\u hash,则已标识重复的块。关联索引允许您快速
      seek()
      查找原始内容,以防在应用程序中排除潜在冲突。使用经验证的加密哈希。不是返回长字符串的自定义方法。您所需要的只是一个集合,以知道是否已经满足哈希。不是地图。问题没有明确说明。你应该只比较从1k边界开始的街区吗?如果一个重复的块在文件中的偏移量100处开始,而一个类似的块随后在文件中的偏移量2200处出现(不是1024的偶数倍),该怎么办@ JBNIZET我使用HasSt稳,以便在反转DeDUP操作时,我知道当前块是哪个块的复制品。@ JimGarrison,这里的关键是考虑大小不重叠的大小为1KB的块。例如,如果文件为5kb,则每个1kb有5个块,5个块的哈希值为1,2,2,1,3。这意味着,有3个唯一块,2个重复块。我们应该只比较1kb边界上的块。@JBNizet,您能否详细说明“已验证的加密哈希”以及我们如何实现它们?
      //implement hashing used in Rabin-Karp algorithm 
      // sum of p^n * a[x]
      //hconst = 69069; //good multiplier for mod 2^32;
       public static long  calculateHash(int [] data, int chunkSize){
          long hash = 1;
          for(int i =0; i < chunkSize; i++)
          {
              int c = data[i];
              hash *= hconst; //multiply with const
              hash += c; //add the byte to hash
          }
          return hash;    
      }