21 #include "rabinkarp.h" 24 #define RABINKARP_MULT2 (RABINKARP_MULT*RABINKARP_MULT) 29 #define PAR2X1(hash,buf,i) (RABINKARP_MULT2*(hash) + \ 30 RABINKARP_MULT*buf[i] + \ 32 #define PAR2X2(hash,buf,i) PAR2X1(PAR2X1(hash,buf,i),buf,i+2) 33 #define PAR2X4(hash,buf,i) PAR2X2(PAR2X2(hash,buf,i),buf,i+4) 34 #define PAR2X8(hash,buf) PAR2X4(PAR2X4(hash,buf,0),buf,8) 37 const static uint32_t RABINKARP_MULT_POW2[32] = {
73 static inline uint32_t rabinkarp_pow(uint32_t n)
75 const uint32_t *m = RABINKARP_MULT_POW2;
87 void rabinkarp_update(rabinkarp_t *sum,
const unsigned char *buf,
size_t len)
90 uint32_t hash = sum->hash;
93 hash = PAR2X8(hash, buf);
98 hash = RABINKARP_MULT * hash + *buf++;
103 sum->mult *= rabinkarp_pow(len);