我阅读了hadoop-1.0.4源代码中的SequenceFile.java。我还发现了sync(long)方法,该方法用于在SequenceFile中将SequenceFile拆分为文件拆分时,在MapReduce中查找“同步标记”(在文件创建时生成的16字节MapReduce)。
/** 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如何才能是二进制安全的?我是不是遗漏了什么?
发布于 2013-10-17 23:39:34
冲突在技术上是可能的,但在现实中却是难以置信的不可能。
来自http://search-hadoop.com/m/VYVra2krg5t1
给定的随机16字节字符串出现在23(均匀分布)数据中的概率约为10^-23。更有可能的是你的数据中心被一颗陨石(http://preshing.com/20110504/hash-collision-probabilities)摧毁了。
https://stackoverflow.com/questions/16251110
复制相似问题