【问题标题】:Rabin fingerprinting tables拉宾指纹表
【发布时间】: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


    【解决方案1】:

    “规范解释”使用不是拉宾指纹的滚动哈希。不过,它非常相似。在不深入研究抽象代数的情况下,两者背后的想法是评估从特定 ring 中的消息派生的多项式,它有 0、1、加法、减法、乘法但没有除法(整数 mod m 表示规范解释;GF(2k) 用于 Rabin 指纹,即系数为 2 的多项式,以 k 次不可约多项式为模。

    最简单的环是整数模2,它有0、1和定义

    +  0 1        -  0 1        *  0 1
    ------        ------        ------
    0  0 1        0  0 1        0  0 0
    1  1 0        1  1 0        0  0 1  .
    

    发生了一件很有趣的事情:加号和减号有相同的定义,都等价于异或。使用计算机单词来表示系数为 2 的多项式,我们可以通过按位异或来加减多项式。这就是 XOR 出现在 rp-&gt;fingerprint ^ rp-&gt;U[om] 中的原因:我们使用 U 表从刚刚离开窗口的字节中减去该术语,因为该术语只有 256 种可能性。

    XOR 的另一种用法((p &lt;&lt; 8) | m) ^ rp-&gt;T[p &gt;&gt; rp-&gt;shift] 是用不可约多项式修改的表达式,即,在规范解释中相当于用 m 修改。如果我们通过多项式长除法来做到这一点(大概是如何计算T 表),我们会注意到从被除数中减去的项(在环中)由高位决定单独(p &gt;&gt; rp-&gt;shift)。稍后进行一些代数操作,我们可以缓存总和(在环中)并从被除数中减去它(在环中,因此按位异或)(((p &lt;&lt; 8) | m))。

    为了完整起见,请注意p &lt;&lt; 8 相当于多项式乘以 x8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-15
      • 2019-04-04
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2014-07-28
      相关资源
      最近更新 更多