func TestLarge(t *testing.T) {
const N = 10000
+ const offsets = 4
ok := "2bb571599a4180e1d542f76904adc3df" // md5sum of "0123456789" * 1000
- block := make([]byte, 10004)
+ block := make([]byte, N+offsets)
c := New()
- for offset := 0; offset < 4; offset++ {
+ for offset := 0; offset < offsets; offset++ {
for i := 0; i < N; i++ {
block[offset+i] = '0' + byte(i%10)
}
}
}
+func TestExtraLarge(t *testing.T) {
+ const N = 100000
+ const offsets = 4
+ ok := "13572e9e296cff52b79c52148313c3a5" // md5sum of "0123456789" * 10000
+ block := make([]byte, N+offsets)
+ c := New()
+ for offset := 0; offset < offsets; offset++ {
+ for i := 0; i < N; i++ {
+ block[offset+i] = '0' + byte(i%10)
+ }
+ for blockSize := 10; blockSize <= N; blockSize *= 10 {
+ blocks := N / blockSize
+ b := block[offset : offset+blockSize]
+ c.Reset()
+ for i := 0; i < blocks; i++ {
+ c.Write(b)
+ }
+ s := fmt.Sprintf("%x", c.Sum(nil))
+ if s != ok {
+ t.Fatalf("md5 TestExtraLarge offset=%d, blockSize=%d = %s want %s", offset, blockSize, s, ok)
+ }
+ }
+ }
+}
+
// Tests that blockGeneric (pure Go) and block (in assembly for amd64, 386, arm) match.
func TestBlockGeneric(t *testing.T) {
gen, asm := New().(*digest), New().(*digest)
}
}
+func TestLarge(t *testing.T) {
+ const N = 10000
+ const offsets = 4
+ ok := "4c207598af7a20db0e3334dd044399a40e467cb81b37f7ba05a4f76dcbd8fd59" // sha256sum of "0123456789" * 1000
+ block := make([]byte, N+offsets)
+ c := New()
+ for offset := 0; offset < offsets; offset++ {
+ for i := 0; i < N; i++ {
+ block[offset+i] = '0' + byte(i%10)
+ }
+ for blockSize := 10; blockSize <= N; blockSize *= 10 {
+ blocks := N / blockSize
+ b := block[offset : offset+blockSize]
+ c.Reset()
+ for i := 0; i < blocks; i++ {
+ c.Write(b)
+ }
+ s := fmt.Sprintf("%x", c.Sum(nil))
+ if s != ok {
+ t.Fatalf("sha256 TestLarge offset=%d, blockSize=%d = %s want %s", offset, blockSize, s, ok)
+ }
+ }
+ }
+}
+
+func TestExtraLarge(t *testing.T) {
+ const N = 100000
+ const offsets = 4
+ ok := "aca9e593cc629cbaa94cd5a07dc029424aad93e5129e5d11f8dcd2f139c16cc0" // sha256sum of "0123456789" * 10000
+ block := make([]byte, N+offsets)
+ c := New()
+ for offset := 0; offset < offsets; offset++ {
+ for i := 0; i < N; i++ {
+ block[offset+i] = '0' + byte(i%10)
+ }
+ for blockSize := 10; blockSize <= N; blockSize *= 10 {
+ blocks := N / blockSize
+ b := block[offset : offset+blockSize]
+ c.Reset()
+ for i := 0; i < blocks; i++ {
+ c.Write(b)
+ }
+ s := fmt.Sprintf("%x", c.Sum(nil))
+ if s != ok {
+ t.Fatalf("sha256 TestExtraLarge offset=%d, blockSize=%d = %s want %s", offset, blockSize, s, ok)
+ }
+ }
+ }
+}
+
func TestMarshalTypeMismatch(t *testing.T) {
h1 := New()
h2 := New224()
}
var bench = New()
-var buf = make([]byte, 8192)
func benchmarkSize(b *testing.B, size int) {
+ buf := make([]byte, size)
sum := make([]byte, bench.Size())
b.Run("New", func(b *testing.B) {
b.ReportAllocs()
b.SetBytes(int64(size))
for i := 0; i < b.N; i++ {
bench.Reset()
- bench.Write(buf[:size])
+ bench.Write(buf)
bench.Sum(sum[:0])
}
})
b.ReportAllocs()
b.SetBytes(int64(size))
for i := 0; i < b.N; i++ {
- Sum224(buf[:size])
+ Sum224(buf)
}
})
b.Run("Sum256", func(b *testing.B) {
b.ReportAllocs()
b.SetBytes(int64(size))
for i := 0; i < b.N; i++ {
- Sum256(buf[:size])
+ Sum256(buf)
}
})
}
func BenchmarkHash8K(b *testing.B) {
benchmarkSize(b, 8192)
}
+
+func BenchmarkHash256K(b *testing.B) {
+ benchmarkSize(b, 256*1024)
+}
+
+func BenchmarkHash1M(b *testing.B) {
+ benchmarkSize(b, 1024*1024)
+}