8 const ROLLSUM_CHAR_OFFSET = 31
10 func WeakChecksum(data []byte) uint32 {
16 func NewRollsum() Rollsum {
20 func (r *Rollsum) Update(p []byte) {
25 for i := 0; i < 16; i++ {
26 r.s1 += uint16(p[n+i])
37 r.s1 += uint16(l * ROLLSUM_CHAR_OFFSET)
38 r.s2 += uint16(((l * (l + 1)) / 2) * ROLLSUM_CHAR_OFFSET)
42 func (r *Rollsum) Rotate(out, in byte) {
43 r.s1 += uint16(in - out)
44 r.s2 += r.s1 - uint16(r.count)*(uint16(out)+uint16(ROLLSUM_CHAR_OFFSET))
47 func (r *Rollsum) Rollin(in byte) {
48 r.s1 += uint16(in) + uint16(ROLLSUM_CHAR_OFFSET)
53 func (r *Rollsum) Rollout(out byte) {
54 r.s1 -= uint16(out) + uint16(ROLLSUM_CHAR_OFFSET)
55 r.s2 -= uint16(r.count) * (uint16(out) + uint16(ROLLSUM_CHAR_OFFSET))
59 func (r *Rollsum) Digest() uint32 {
60 return (uint32(r.s2) << 16) | (uint32(r.s1) & 0xffff)
63 func (r *Rollsum) Reset() {