30 # define ROLLSUM_CHAR_OFFSET 31
33 typedef struct _Rollsum {
39 void RollsumUpdate(Rollsum *sum,
const unsigned char *buf,
size_t len);
43 static inline void RollsumInit(Rollsum *sum)
45 sum->count = sum->s1 = sum->s2 = 0;
48 static inline void RollsumRotate(Rollsum *sum,
unsigned char out,
52 sum->s2 += sum->s1 - sum->count * (out + ROLLSUM_CHAR_OFFSET);
55 static inline void RollsumRollin(Rollsum *sum,
unsigned char in)
57 sum->s1 += in + ROLLSUM_CHAR_OFFSET;
62 static inline void RollsumRollout(Rollsum *sum,
unsigned char out)
64 sum->s1 -= out + ROLLSUM_CHAR_OFFSET;
65 sum->s2 -= sum->count * (out + ROLLSUM_CHAR_OFFSET);
69 static inline uint32_t RollsumDigest(Rollsum *sum)
71 return ((uint32_t)sum->s2 << 16) | ((uint32_t)sum->s1 & 0xffff);