mirror of
https://github.com/vbatts/imgsrv.git
synced 2024-11-27 02:25:41 +00:00
adler32 is not nearly unique. switching to sh256 and adding tests
This commit is contained in:
parent
2a87e1f8ca
commit
629bafaa7f
2 changed files with 21 additions and 4 deletions
13
hash/hash.go
13
hash/hash.go
|
@ -2,13 +2,18 @@ package hash
|
|||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"crypto/sha256"
|
||||
"fmt"
|
||||
"hash/adler32"
|
||||
"io"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func init() {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
}
|
||||
|
||||
func Rand64() int64 {
|
||||
return rand.Int63()
|
||||
}
|
||||
|
@ -31,7 +36,7 @@ func GetMd5FromBytes(blob []byte) (sum []byte) {
|
|||
|
||||
/* get a small, decently unique hash */
|
||||
func GetSmallHash() (small_hash string) {
|
||||
h := adler32.New()
|
||||
io.WriteString(h, fmt.Sprintf("%d", time.Now().Unix()))
|
||||
return fmt.Sprintf("%X", h.Sum(nil))
|
||||
h := sha256.New()
|
||||
io.WriteString(h, fmt.Sprintf("%d%d", time.Now().UnixNano(), Rand64()))
|
||||
return strings.ToLower(fmt.Sprintf("%X", h.Sum(nil)[0:9]))
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package hash
|
|||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"sort"
|
||||
)
|
||||
|
||||
func TestRand64(t *testing.T) {
|
||||
|
@ -36,4 +37,15 @@ func TestMd5String(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestHash(t *testing.T) {
|
||||
seen := []string{}
|
||||
for i := 0; i < 10000; i++ {
|
||||
h := GetSmallHash()
|
||||
j := sort.SearchStrings(seen, h)
|
||||
if len(seen) != 0 && j < len(seen) && h == seen[j] {
|
||||
t.Errorf("there is a non-unique hash after %d attempts [%s and %s]", i, h, seen[j])
|
||||
} else {
|
||||
seen = append(seen, h)
|
||||
sort.Strings(seen)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue