Skip to content

Commit 092d18b

Browse files
committed
internal/coverage: use 128-bit FNV-1a hash instead of MD5
This change replaces the MD5 hash used to identify coverage files with a 128-bit FNV-1a hash. This change is motivated by the fact that MD5 should only be used for legacy cryptographic purposes. The 128-bit FNV-1a hash is sufficient for the purpose of identifying coverage files, it having the same theoretical collision resistance as MD5, but with the added benefit of being faster to compute. Change-Id: I7b547ce2ea784f8f4071599a10fcb512b87ee469 Reviewed-on: https://go-review.googlesource.com/c/go/+/617360 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Than McIntosh <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Reviewed-by: Cherry Mui <[email protected]>
1 parent 9a44b8e commit 092d18b

File tree

7 files changed

+36
-25
lines changed

7 files changed

+36
-25
lines changed

src/cmd/covdata/metamerge.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ package main
99
// and "intersect" subcommands.
1010

1111
import (
12-
"crypto/md5"
1312
"fmt"
13+
"hash/fnv"
1414
"internal/coverage"
1515
"internal/coverage/calloc"
1616
"internal/coverage/cmerge"
@@ -207,7 +207,8 @@ func (mm *metaMerge) endPod(pcombine bool) {
207207
// part of a merge operation, specifically a merge with the
208208
// "-pcombine" flag.
209209
func (mm *metaMerge) emitMeta(outdir string, pcombine bool) [16]byte {
210-
fh := md5.New()
210+
fh := fnv.New128a()
211+
fhSum := fnv.New128a()
211212
blobs := [][]byte{}
212213
tlen := uint64(unsafe.Sizeof(coverage.MetaFileHeader{}))
213214
for _, p := range mm.pkgs {
@@ -219,7 +220,9 @@ func (mm *metaMerge) emitMeta(outdir string, pcombine bool) [16]byte {
219220
} else {
220221
blob = p.mdblob
221222
}
222-
ph := md5.Sum(blob)
223+
fhSum.Reset()
224+
fhSum.Write(blob)
225+
ph := fhSum.Sum(nil)
223226
blobs = append(blobs, blob)
224227
if _, err := fh.Write(ph[:]); err != nil {
225228
panic(fmt.Sprintf("internal error: md5 sum failed: %v", err))

src/go/build/deps_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ var depsRules = `
685685
< internal/trace/traceviewer;
686686
687687
# Coverage.
688-
FMT, crypto/md5, encoding/binary, regexp, sort, text/tabwriter,
688+
FMT, hash/fnv, encoding/binary, regexp, sort, text/tabwriter,
689689
internal/coverage, internal/coverage/uleb128
690690
< internal/coverage/cmerge,
691691
internal/coverage/pods,

src/internal/coverage/cfile/emit.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
package cfile
1010

1111
import (
12-
"crypto/md5"
1312
"fmt"
13+
"hash/fnv"
1414
"internal/coverage"
1515
"internal/coverage/encodecounter"
1616
"internal/coverage/encodemeta"
@@ -206,7 +206,7 @@ func prepareForMetaEmit() ([]rtcov.CovMetaBlob, error) {
206206
}
207207
}
208208

209-
h := md5.New()
209+
h := fnv.New128a()
210210
tlen := uint64(unsafe.Sizeof(coverage.MetaFileHeader{}))
211211
for _, entry := range ml {
212212
if _, err := h.Write(entry.Hash[:]); err != nil {

src/internal/coverage/decodemeta/decodefile.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ package decodemeta
1212

1313
import (
1414
"bufio"
15-
"crypto/md5"
1615
"encoding/binary"
1716
"fmt"
17+
"hash/fnv"
1818
"internal/coverage"
1919
"internal/coverage/slicereader"
2020
"internal/coverage/stringtab"
@@ -171,8 +171,10 @@ func (r *CoverageMetaFileReader) FileHash() [16]byte {
171171
func (r *CoverageMetaFileReader) GetPackageDecoder(pkIdx uint32, payloadbuf []byte) (*CoverageMetaDataDecoder, []byte, error) {
172172
pp, err := r.GetPackagePayload(pkIdx, payloadbuf)
173173
if r.debug {
174+
h := fnv.New128a()
175+
h.Write(pp)
174176
fmt.Fprintf(os.Stderr, "=-= pkidx=%d payload length is %d hash=%s\n",
175-
pkIdx, len(pp), fmt.Sprintf("%x", md5.Sum(pp)))
177+
pkIdx, len(pp), fmt.Sprintf("%x", h.Sum(nil)))
176178
}
177179
if err != nil {
178180
return nil, nil, err

src/internal/coverage/encodemeta/encode.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ package encodemeta
1010

1111
import (
1212
"bytes"
13-
"crypto/md5"
1413
"encoding/binary"
1514
"fmt"
1615
"hash"
16+
"hash/fnv"
1717
"internal/coverage"
1818
"internal/coverage/stringtab"
1919
"internal/coverage/uleb128"
@@ -39,7 +39,7 @@ func NewCoverageMetaDataBuilder(pkgpath string, pkgname string, modulepath strin
3939
}
4040
x := &CoverageMetaDataBuilder{
4141
tmp: make([]byte, 0, 256),
42-
h: md5.New(),
42+
h: fnv.New128a(),
4343
}
4444
x.stab.InitWriter()
4545
x.stab.Lookup("")
@@ -188,7 +188,7 @@ func (b *CoverageMetaDataBuilder) Emit(w io.WriteSeeker) ([16]byte, error) {
188188
// HashFuncDesc computes an md5 sum of a coverage.FuncDesc and returns
189189
// a digest for it.
190190
func HashFuncDesc(f *coverage.FuncDesc) [16]byte {
191-
h := md5.New()
191+
h := fnv.New128a()
192192
tmp := make([]byte, 0, 32)
193193
hashFuncDesc(h, f, tmp)
194194
var r [16]byte

src/internal/coverage/encodemeta/encodefile.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ package encodemeta
66

77
import (
88
"bufio"
9-
"crypto/md5"
109
"encoding/binary"
1110
"fmt"
11+
"hash/fnv"
1212
"internal/coverage"
1313
"internal/coverage/stringtab"
1414
"io"
@@ -112,7 +112,9 @@ func (m *CoverageMetaFileWriter) Write(finalHash [16]byte, blobs [][]byte, mode
112112
// Now emit blobs themselves.
113113
for k, blob := range blobs {
114114
if m.debug {
115-
fmt.Fprintf(os.Stderr, "=+= writing blob %d len %d at off=%d hash %s\n", k, len(blob), off2, fmt.Sprintf("%x", md5.Sum(blob)))
115+
h := fnv.New128a()
116+
h.Write(blob)
117+
fmt.Fprintf(os.Stderr, "=+= writing blob %d len %d at off=%d hash %s\n", k, len(blob), off2, fmt.Sprintf("%x", h.Sum(nil)))
116118
}
117119
if _, err = m.w.Write(blob); err != nil {
118120
return fmt.Errorf("error writing %s: %v", m.mfname, err)

src/internal/coverage/pods/pods_test.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
package pods_test
66

77
import (
8-
"crypto/md5"
98
"fmt"
9+
"hash/fnv"
1010
"internal/coverage"
1111
"internal/coverage/pods"
1212
"os"
@@ -35,13 +35,17 @@ func TestPodCollection(t *testing.T) {
3535
}
3636

3737
mkmeta := func(dir string, tag string) string {
38-
hash := md5.Sum([]byte(tag))
38+
h := fnv.New128a()
39+
h.Write([]byte(tag))
40+
hash := h.Sum(nil)
3941
fn := fmt.Sprintf("%s.%x", coverage.MetaFilePref, hash)
4042
return mkfile(dir, fn)
4143
}
4244

4345
mkcounter := func(dir string, tag string, nt int, pid int) string {
44-
hash := md5.Sum([]byte(tag))
46+
h := fnv.New128a()
47+
h.Write([]byte(tag))
48+
hash := h.Sum(nil)
4549
fn := fmt.Sprintf(coverage.CounterFileTempl, coverage.CounterFilePref, hash, pid, nt)
4650
return mkfile(dir, fn)
4751
}
@@ -112,16 +116,16 @@ func TestPodCollection(t *testing.T) {
112116
}
113117

114118
expected := []string{
115-
`o1/covmeta.ae7be26cdaa742ca148068d5ac90eaca [
116-
o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.40.2 o:0
117-
o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.41.2 o:0
118-
o1/covcounters.ae7be26cdaa742ca148068d5ac90eaca.42.1 o:0
119-
o2/covcounters.ae7be26cdaa742ca148068d5ac90eaca.35.11 o:1
119+
`o1/covmeta.0880952782ab1be95aa0733055a4d06b [
120+
o1/covcounters.0880952782ab1be95aa0733055a4d06b.40.2 o:0
121+
o1/covcounters.0880952782ab1be95aa0733055a4d06b.41.2 o:0
122+
o1/covcounters.0880952782ab1be95aa0733055a4d06b.42.1 o:0
123+
o2/covcounters.0880952782ab1be95aa0733055a4d06b.35.11 o:1
120124
]`,
121-
`o2/covmeta.aaf2f89992379705dac844c0a2a1d45f [
122-
o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.36.3 o:1
123-
o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.37.2 o:1
124-
o2/covcounters.aaf2f89992379705dac844c0a2a1d45f.38.1 o:1
125+
`o2/covmeta.0880952783ab1be95aa0733055a4d1a6 [
126+
o2/covcounters.0880952783ab1be95aa0733055a4d1a6.36.3 o:1
127+
o2/covcounters.0880952783ab1be95aa0733055a4d1a6.37.2 o:1
128+
o2/covcounters.0880952783ab1be95aa0733055a4d1a6.38.1 o:1
125129
]`,
126130
}
127131
for k, exp := range expected {

0 commit comments

Comments
 (0)