Последние пару дней я изучал дактилоскопию Рабина. Хотя общая идея достаточно проста, у меня возникают серьезные проблемы с пониманием реализаций, циркулирующих в сети. В частности, все они, по-видимому, взяты из оригинальной документа 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 генерируются из начального полинома. Я не видел ни в одной из статей, касающихся снятия отпечатков пальцев Рабина, обсуждения использования этих двух таблиц и операций XOR. Я чувствую, что это как-то связано с арифметикой по модулю, но я не совсем уверен. исходный код Git также использует отпечатки пальцев Рабина, но вместо получения таблицы динамически у них есть набор заранее вычисленных. Итак, мой вопрос: чего именно достигают эти операции Xor, и код обычно выглядит совершенно иначе, чем «канонический» объяснение алгоритма