1

hadoop-1.0.4 ソース コードの SequenceFile.java を読みました。そしてsync(long)、MapReduce で SequenceFile をファイル分割に分割するときに、SequenceFile で「同期マーカー」(ファイル作成時に生成された場合は 16 バイトの MD5) を見つけるために使用されるメソッドを見つけます。

/** Seek to the next sync mark past a given position.*/
public synchronized void sync(long position) throws IOException {
  if (position+SYNC_SIZE >= end) {
    seek(end);
    return;
  }

  try {
    seek(position+4);                         // skip escape
    in.readFully(syncCheck);
    int syncLen = sync.length;
    for (int i = 0; in.getPos() < end; i++) {
      int j = 0;
      for (; j < syncLen; j++) {
        if (sync[j] != syncCheck[(i+j)%syncLen])
          break;
      }
      if (j == syncLen) {
        in.seek(in.getPos() - SYNC_SIZE);     // position before sync
        return;
      }
      syncCheck[i%syncLen] = in.readByte();
    }
  } catch (ChecksumException e) {             // checksum failure
    handleChecksumException(e);
  }
}

これらのコードは、単に「同期マーカー」と同じデータを含むデータ シーケンスを探します。

私の疑問:
SequenceFile のデータに「同期マーカー」と同じ 16 バイトのデータ シーケンスが含まれている状況を考えてみましょう。上記のコードは、誤ってその 16 バイトのデータを「同期マーカー」として扱い、SequenceFile が勝ち正しく解析されませんか?

データまたは同期マーカーに関する「エスケープ」操作が見つかりません。SequenceFile をバイナリセーフにするにはどうすればよいですか? 何か不足していますか?

4

1 に答える 1

0

衝突は技術的には可能ですが、実際には信じられないほど起こりそうにありません。

http://search-hadoop.com/m/VYVra2krg5t1から:

ペタバイトの (一様に分散された) データにランダムな 16 バイト文字列が出現する確率は、約 10^-23 です。データセンターが隕石によって全滅する可能性が高くなります ( http://preshing.com/20110504/hash-collision-probabilities )。

于 2013-10-17T15:39:33.750 に答える