60 lines
1.3 KiB
Go
Raw Normal View History

2023-07-22 15:02:22 +00:00
package hash_test
import (
"bytes"
"testing"
"git.akyoto.dev/go/hash"
)
2023-07-23 09:40:22 +00:00
// Hashes generated in tests will be saved to check for collisions.
2023-07-22 22:46:39 +00:00
var hashes = map[uint64][]byte{}
2023-07-22 15:02:22 +00:00
2023-07-23 09:40:22 +00:00
// addHash adds a new hash and checks for collisions.
func addHash(t *testing.T, sum uint64, data []byte) {
saved, found := hashes[sum]
2023-07-22 15:02:22 +00:00
2023-07-23 09:40:22 +00:00
if found && !bytes.Equal(saved, data) {
t.Fatalf("collision between %v and %v:\nhash %064b", saved, data, sum)
}
save := make([]byte, len(data))
copy(save, data)
hashes[sum] = save
}
2023-07-22 15:02:22 +00:00
2023-07-23 09:40:22 +00:00
// TestTiny hashes every single permutation that is 1-32 bytes long.
func TestTiny(t *testing.T) {
for size := 1; size <= 32; size++ {
data := make([]byte, size)
2023-07-22 15:02:22 +00:00
2023-07-23 09:40:22 +00:00
for i := 0; i <= 255*size; i++ {
sum := hash.Bytes(data)
addHash(t, sum, data)
data[i%size] += 1
2023-07-22 15:02:22 +00:00
}
}
}
2023-07-23 09:40:22 +00:00
// TestZeroed hashes completely zeroed buffers that are 1-8192 bytes long.
func TestZeroed(t *testing.T) {
2023-07-22 22:46:39 +00:00
zero := make([]byte, 8192)
2023-07-22 15:02:22 +00:00
2023-07-22 22:46:39 +00:00
for size := 1; size <= len(zero); size++ {
2023-07-23 09:40:22 +00:00
data := zero[:size]
sum := hash.Bytes(data)
addHash(t, sum, data)
}
}
2023-07-22 15:02:22 +00:00
2023-07-23 09:40:22 +00:00
// TestSameByte hashes every byte repetition that is 1-512 bytes long.
func TestSameByte(t *testing.T) {
for b := 1; b < 256; b++ {
for size := 1; size <= 512; size++ {
data := bytes.Repeat([]byte{byte(b)}, size)
sum := hash.Bytes(data)
addHash(t, sum, data)
2023-07-22 15:02:22 +00:00
}
}
}