【发布时间】:2020-12-02 05:26:11
【问题描述】:
过去几天我一直在研究拉宾指纹。虽然总体思路很简单,但我在理解网络上流传的实现时遇到了很大的麻烦。特别是它们似乎都源自原始LBFS paper,即源自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's source code 也使用 rabin 指纹识别,但不是动态地派生表,而是使用一组预先计算的表。所以我的问题是 - 这些 Xor 操作到底能实现什么,并且代码通常看起来与“规范”explanation of the algorithm
完全不同【问题讨论】:
标签: c algorithm math fingerprinting rabin-karp