在过去的几天里,我一直在研究拉宾指纹。虽然总体思路很简单,但我在理解网络上流传的实现时遇到了很大的麻烦。特别是它们似乎都源自原始的LBFS 论文,即来自librabinpoly的滑动窗口定义为:
33 static u_int64_t slide8(RabinPoly *rp, unsigned char m) {
34 rp->circbuf_pos++;
35 if (rp->circbuf_pos >= rp->window_size) {
36 rp->circbuf_pos = 0;
37 }
38 unsigned char om = rp->circbuf[rp->circbuf_pos];
39 rp->circbuf[rp->circbuf_pos] = m;
40 return rp->fingerprint = append8 (rp, rp->fingerprint ^ rp->U[om], m);
41 }
42
43 static u_int64_t append8(RabinPoly *rp, u_int64_t p, unsigned char m) {
44 return ((p << 8) | m) ^ rp->T[p >> rp->shift];
45 }
U/T 表是从初始多项式生成的。我没有在任何有关 rabin 指纹识别的论文中看到讨论这两个表的用法和 XOR 操作。我的直觉是这与模运算有关,但我不完全确定。Git 的源代码也使用 rabin 指纹识别,但它们不是动态地派生表,而是使用一组预先计算的表。所以我的问题是 - 这些 Xor 操作究竟能实现什么,并且代码通常看起来与算法的“规范”解释完全不同