aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hash/crc32/crc32.go32
-rw-r--r--src/hash/crc32/crc32_test.go3
2 files changed, 19 insertions, 16 deletions
diff --git a/src/hash/crc32/crc32.go b/src/hash/crc32/crc32.go
index 4fcb168e6e..e828089308 100644
--- a/src/hash/crc32/crc32.go
+++ b/src/hash/crc32/crc32.go
@@ -128,8 +128,9 @@ func MakeTable(poly uint32) *Table {
case Castagnoli:
castagnoliOnce.Do(castagnoliInit)
return castagnoliTable
+ default:
+ return simpleMakeTable(poly)
}
- return simpleMakeTable(poly)
}
// digest represents the partial evaluation of a checksum.
@@ -205,32 +206,31 @@ func readUint32(b []byte) uint32 {
return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
}
-// Update returns the result of adding the bytes in p to the crc.
-func Update(crc uint32, tab *Table, p []byte) uint32 {
+func update(crc uint32, tab *Table, p []byte, checkInitIEEE bool) uint32 {
switch {
case haveCastagnoli.Load() && tab == castagnoliTable:
return updateCastagnoli(crc, p)
case tab == IEEETable:
- // Unfortunately, because IEEETable is exported, IEEE may be used without a
- // call to MakeTable. We have to make sure it gets initialized in that case.
- ieeeOnce.Do(ieeeInit)
+ if checkInitIEEE {
+ ieeeOnce.Do(ieeeInit)
+ }
return updateIEEE(crc, p)
default:
return simpleUpdate(crc, tab, p)
}
}
+// Update returns the result of adding the bytes in p to the crc.
+func Update(crc uint32, tab *Table, p []byte) uint32 {
+ // Unfortunately, because IEEETable is exported, IEEE may be used without a
+ // call to MakeTable. We have to make sure it gets initialized in that case.
+ return update(crc, tab, p, true)
+}
+
func (d *digest) Write(p []byte) (n int, err error) {
- switch {
- case haveCastagnoli.Load() && d.tab == castagnoliTable:
- d.crc = updateCastagnoli(d.crc, p)
- case d.tab == IEEETable:
- // We only create digest objects through New() which takes care of
- // initialization in this case.
- d.crc = updateIEEE(d.crc, p)
- default:
- d.crc = simpleUpdate(d.crc, d.tab, p)
- }
+ // We only create digest objects through New() which takes care of
+ // initialization in this case.
+ d.crc = update(d.crc, d.tab, p, false)
return len(p), nil
}
diff --git a/src/hash/crc32/crc32_test.go b/src/hash/crc32/crc32_test.go
index cbb869dfd6..f084612f6f 100644
--- a/src/hash/crc32/crc32_test.go
+++ b/src/hash/crc32/crc32_test.go
@@ -329,11 +329,14 @@ func benchmark(b *testing.B, h hash.Hash32, n, alignment int64) {
h.Reset()
h.Write(data)
h.Sum(in)
+ // Avoid further allocations
+ in = in[:0]
b.ResetTimer()
for i := 0; i < b.N; i++ {
h.Reset()
h.Write(data)
h.Sum(in)
+ in = in[:0]
}
}