khenaidoo | ab1f7bd | 2019-11-14 14:00:27 -0500 | [diff] [blame] | 1 | // Copyright 2009 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | // Package crc provides utility function for cyclic redundancy check |
| 6 | // algorithms. |
| 7 | package crc |
| 8 | |
| 9 | import ( |
| 10 | "hash" |
| 11 | "hash/crc32" |
| 12 | ) |
| 13 | |
| 14 | // The size of a CRC-32 checksum in bytes. |
| 15 | const Size = 4 |
| 16 | |
| 17 | type digest struct { |
| 18 | crc uint32 |
| 19 | tab *crc32.Table |
| 20 | } |
| 21 | |
| 22 | // New creates a new hash.Hash32 computing the CRC-32 checksum |
| 23 | // using the polynomial represented by the Table. |
| 24 | // Modified by xiangli to take a prevcrc. |
| 25 | func New(prev uint32, tab *crc32.Table) hash.Hash32 { return &digest{prev, tab} } |
| 26 | |
| 27 | func (d *digest) Size() int { return Size } |
| 28 | |
| 29 | func (d *digest) BlockSize() int { return 1 } |
| 30 | |
| 31 | func (d *digest) Reset() { d.crc = 0 } |
| 32 | |
| 33 | func (d *digest) Write(p []byte) (n int, err error) { |
| 34 | d.crc = crc32.Update(d.crc, d.tab, p) |
| 35 | return len(p), nil |
| 36 | } |
| 37 | |
| 38 | func (d *digest) Sum32() uint32 { return d.crc } |
| 39 | |
| 40 | func (d *digest) Sum(in []byte) []byte { |
| 41 | s := d.Sum32() |
| 42 | return append(in, byte(s>>24), byte(s>>16), byte(s>>8), byte(s)) |
| 43 | } |