...

Source file src/crypto/md5/md5_test.go

Documentation: crypto/md5

		 1  // Copyright 2009 The Go Authors. All rights reserved.
		 2  // Use of this source code is governed by a BSD-style
		 3  // license that can be found in the LICENSE file.
		 4  
		 5  package md5
		 6  
		 7  import (
		 8  	"bytes"
		 9  	"crypto/rand"
		10  	"encoding"
		11  	"fmt"
		12  	"hash"
		13  	"io"
		14  	"testing"
		15  	"unsafe"
		16  )
		17  
		18  type md5Test struct {
		19  	out			 string
		20  	in				string
		21  	halfState string // marshaled hash state after first half of in written, used by TestGoldenMarshal
		22  }
		23  
		24  var golden = []md5Test{
		25  	{"d41d8cd98f00b204e9800998ecf8427e", "", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},
		26  	{"0cc175b9c0f1b6a831c399e269772661", "a", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},
		27  	{"187ef4436122d1cc2f40dc2b92f0eba0", "ab", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tva\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"},
		28  	{"900150983cd24fb0d6963f7d28e17f72", "abc", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tva\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"},
		29  	{"e2fc714c4727ee9395f324cd2e7f331f", "abcd", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02"},
		30  	{"ab56b4d92b40713acc5af89985d4b786", "abcde", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02"},
		31  	{"e80b5017098950fc58aad83c8c14978e", "abcdef", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvabc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03"},
		32  	{"7ac66c0f148de9519b8bd264312c4d64", "abcdefg", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvabc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03"},
		33  	{"e8dc4081b13434b45189a720b77b6818", "abcdefgh", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"},
		34  	{"8aa99b1f439ff71293e95357bac6fd94", "abcdefghi", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"},
		35  	{"a925576942e94b2ef57a066101b48876", "abcdefghij", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvabcde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05"},
		36  	{"d747fc1719c7eacb84058196cfe56d57", "Discard medicine more than two years old.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvDiscard medicine mor\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14"},
		37  	{"bff2dcb37ef3a44ba43ab144768ca837", "He who has a shady past knows that nice guys finish last.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvHe who has a shady past know\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"},
		38  	{"0441015ecb54a7342d017ed1bcfdbea5", "I wouldn't marry him with a ten foot pole.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvI wouldn't marry him \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15"},
		39  	{"9e3cac8e9e9757a60c3ea391130d3689", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvFree! Free!/A trip/to Mars/f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"},
		40  	{"a0f04459b031f916a59a35cc482dc039", "The days of the digital watch are numbered.	-Tom Stoppard", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvThe days of the digital watch\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d"},
		41  	{"e7a48e0fe884faf31475d2a04b1362cc", "Nepal premier won't resign.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvNepal premier\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r"},
		42  	{"637d2fe925c07c113800509964fb0e06", "For every action there is an equal and opposite government program.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvFor every action there is an equa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!"},
		43  	{"834a8d18d5c6562119cf4c7f5086cb71", "His money is twice tainted: 'taint yours and 'taint mine.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvHis money is twice tainted: \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"},
		44  	{"de3a4d2fd6c73ec2db2abad23b444281", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvThere is no reason for any individual to hav\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,"},
		45  	{"acf203f997e2cf74ea3aff86985aefaf", "It's a tiny change to the code and not completely disgusting. - Bob Manchek", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvIt's a tiny change to the code and no\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%"},
		46  	{"e1c1384cb4d2221dfdd7c795a4222c9a", "size:	a.out:	bad magic", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102Tvsize:	a.out\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f"},
		47  	{"c90f3ddecc54f34228c063d7525bf644", "The major problem is with sendmail.	-Mark Horton", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvThe major problem is wit\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18"},
		48  	{"cdf7ab6c1fd49bd9933c43f3ea5af185", "Give me a rock, paper and scissors and I will move the world.	CCFestoon", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvGive me a rock, paper and scissors a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$"},
		49  	{"83bc85234942fc883c063cbd7f0ad5d0", "If the enemy is within range, then so are you.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvIf the enemy is within \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17"},
		50  	{"277cbe255686b48dd7e8f389394d9299", "It's well we cannot hear the screams/That we create in others' dreams.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvIt's well we cannot hear the scream\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#"},
		51  	{"fd3fb0a7ffb8af16603f3d3af98f8e1f", "You remind me of a TV show, but that's all right: I watch it anyway.", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvYou remind me of a TV show, but th\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\""},
		52  	{"469b13a78ebf297ecda64d4723655154", "C is as portable as Stonehedge!!", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvC is as portable\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10"},
		53  	{"63eb3a2f466410104731c4b037600110", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvEven if I could be Shakespeare, I think I sh\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,"},
		54  	{"72c2ed7592debca1c90fc0100f931a2f", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.	Lewis-Randall Rule", "md5\x01\xa7\xc9\x18\x9b\xc3E\x18\xf2\x82\xfd\xf3$\x9d_\v\nem\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B"},
		55  	{"132f7619d33b523b1d9e5bd8e0928355", "How can you write a big system without C++?	-Paul Glick", "md5\x01gE#\x01\xefͫ\x89\x98\xba\xdc\xfe\x102TvHow can you write a big syst\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c"},
		56  }
		57  
		58  func TestGolden(t *testing.T) {
		59  	for i := 0; i < len(golden); i++ {
		60  		g := golden[i]
		61  		s := fmt.Sprintf("%x", Sum([]byte(g.in)))
		62  		if s != g.out {
		63  			t.Fatalf("Sum function: md5(%s) = %s want %s", g.in, s, g.out)
		64  		}
		65  		c := New()
		66  		buf := make([]byte, len(g.in)+4)
		67  		for j := 0; j < 3+4; j++ {
		68  			if j < 2 {
		69  				io.WriteString(c, g.in)
		70  			} else if j == 2 {
		71  				io.WriteString(c, g.in[0:len(g.in)/2])
		72  				c.Sum(nil)
		73  				io.WriteString(c, g.in[len(g.in)/2:])
		74  			} else if j > 2 {
		75  				// test unaligned write
		76  				buf = buf[1:]
		77  				copy(buf, g.in)
		78  				c.Write(buf[:len(g.in)])
		79  			}
		80  			s := fmt.Sprintf("%x", c.Sum(nil))
		81  			if s != g.out {
		82  				t.Fatalf("md5[%d](%s) = %s want %s", j, g.in, s, g.out)
		83  			}
		84  			c.Reset()
		85  		}
		86  	}
		87  }
		88  
		89  func TestGoldenMarshal(t *testing.T) {
		90  	for _, g := range golden {
		91  		h := New()
		92  		h2 := New()
		93  
		94  		io.WriteString(h, g.in[:len(g.in)/2])
		95  
		96  		state, err := h.(encoding.BinaryMarshaler).MarshalBinary()
		97  		if err != nil {
		98  			t.Errorf("could not marshal: %v", err)
		99  			continue
	 100  		}
	 101  
	 102  		if string(state) != g.halfState {
	 103  			t.Errorf("md5(%q) state = %q, want %q", g.in, state, g.halfState)
	 104  			continue
	 105  		}
	 106  
	 107  		if err := h2.(encoding.BinaryUnmarshaler).UnmarshalBinary(state); err != nil {
	 108  			t.Errorf("could not unmarshal: %v", err)
	 109  			continue
	 110  		}
	 111  
	 112  		io.WriteString(h, g.in[len(g.in)/2:])
	 113  		io.WriteString(h2, g.in[len(g.in)/2:])
	 114  
	 115  		if actual, actual2 := h.Sum(nil), h2.Sum(nil); !bytes.Equal(actual, actual2) {
	 116  			t.Errorf("md5(%q) = 0x%x != marshaled 0x%x", g.in, actual, actual2)
	 117  		}
	 118  	}
	 119  }
	 120  
	 121  func TestLarge(t *testing.T) {
	 122  	const N = 10000
	 123  	ok := "2bb571599a4180e1d542f76904adc3df" // md5sum of "0123456789" * 1000
	 124  	block := make([]byte, 10004)
	 125  	c := New()
	 126  	for offset := 0; offset < 4; offset++ {
	 127  		for i := 0; i < N; i++ {
	 128  			block[offset+i] = '0' + byte(i%10)
	 129  		}
	 130  		for blockSize := 10; blockSize <= N; blockSize *= 10 {
	 131  			blocks := N / blockSize
	 132  			b := block[offset : offset+blockSize]
	 133  			c.Reset()
	 134  			for i := 0; i < blocks; i++ {
	 135  				c.Write(b)
	 136  			}
	 137  			s := fmt.Sprintf("%x", c.Sum(nil))
	 138  			if s != ok {
	 139  				t.Fatalf("md5 TestLarge offset=%d, blockSize=%d = %s want %s", offset, blockSize, s, ok)
	 140  			}
	 141  		}
	 142  	}
	 143  }
	 144  
	 145  // Tests that blockGeneric (pure Go) and block (in assembly for amd64, 386, arm) match.
	 146  func TestBlockGeneric(t *testing.T) {
	 147  	gen, asm := New().(*digest), New().(*digest)
	 148  	buf := make([]byte, BlockSize*20) // arbitrary factor
	 149  	rand.Read(buf)
	 150  	blockGeneric(gen, buf)
	 151  	block(asm, buf)
	 152  	if *gen != *asm {
	 153  		t.Error("block and blockGeneric resulted in different states")
	 154  	}
	 155  }
	 156  
	 157  // Tests for unmarshaling hashes that have hashed a large amount of data
	 158  // The initial hash generation is omitted from the test, because it takes a long time.
	 159  // The test contains some already-generated states, and their expected sums
	 160  // Tests a problem that is outlined in GitHub issue #29541
	 161  // The problem is triggered when an amount of data has been hashed for which
	 162  // the data length has a 1 in the 32nd bit. When casted to int, this changes
	 163  // the sign of the value, and causes the modulus operation to return a
	 164  // different result.
	 165  type unmarshalTest struct {
	 166  	state string
	 167  	sum	 string
	 168  }
	 169  
	 170  var largeUnmarshalTests = []unmarshalTest{
	 171  	// Data length: 7_102_415_735
	 172  	{
	 173  		state: "md5\x01\xa5\xf7\xf0=\xd6S\x85\xd9M\n}\xc3\u0601\x89\xe7@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa7VCw",
	 174  		sum:	 "cddefcf74ffec709a0b45a6a987564d5",
	 175  	},
	 176  	// Data length: 6_565_544_823
	 177  	{
	 178  		state: "md5\x01{\xda\x1a\xc7\xc9'?\x83EX\xe0\x88q\xfeG\x18@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87VCw",
	 179  		sum:	 "fd9f41874ab240698e7bc9c3ae70c8e4",
	 180  	},
	 181  }
	 182  
	 183  func safeSum(h hash.Hash) (sum []byte, err error) {
	 184  	defer func() {
	 185  		if r := recover(); r != nil {
	 186  			err = fmt.Errorf("sum panic: %v", r)
	 187  		}
	 188  	}()
	 189  
	 190  	return h.Sum(nil), nil
	 191  }
	 192  
	 193  func TestLargeHashes(t *testing.T) {
	 194  	for i, test := range largeUnmarshalTests {
	 195  
	 196  		h := New()
	 197  		if err := h.(encoding.BinaryUnmarshaler).UnmarshalBinary([]byte(test.state)); err != nil {
	 198  			t.Errorf("test %d could not unmarshal: %v", i, err)
	 199  			continue
	 200  		}
	 201  
	 202  		sum, err := safeSum(h)
	 203  		if err != nil {
	 204  			t.Errorf("test %d could not sum: %v", i, err)
	 205  			continue
	 206  		}
	 207  
	 208  		if fmt.Sprintf("%x", sum) != test.sum {
	 209  			t.Errorf("test %d sum mismatch: expect %s got %x", i, test.sum, sum)
	 210  		}
	 211  	}
	 212  }
	 213  
	 214  var bench = New()
	 215  var buf = make([]byte, 1024*1024*8+1)
	 216  var sum = make([]byte, bench.Size())
	 217  
	 218  func benchmarkSize(b *testing.B, size int, unaligned bool) {
	 219  	b.SetBytes(int64(size))
	 220  	buf := buf
	 221  	if unaligned {
	 222  		if uintptr(unsafe.Pointer(&buf[0]))&(unsafe.Alignof(uint32(0))-1) == 0 {
	 223  			buf = buf[1:]
	 224  		}
	 225  	}
	 226  	b.ResetTimer()
	 227  	for i := 0; i < b.N; i++ {
	 228  		bench.Reset()
	 229  		bench.Write(buf[:size])
	 230  		bench.Sum(sum[:0])
	 231  	}
	 232  }
	 233  
	 234  func BenchmarkHash8Bytes(b *testing.B) {
	 235  	benchmarkSize(b, 8, false)
	 236  }
	 237  
	 238  func BenchmarkHash64(b *testing.B) {
	 239  	benchmarkSize(b, 64, false)
	 240  }
	 241  
	 242  func BenchmarkHash128(b *testing.B) {
	 243  	benchmarkSize(b, 128, false)
	 244  }
	 245  
	 246  func BenchmarkHash256(b *testing.B) {
	 247  	benchmarkSize(b, 256, false)
	 248  }
	 249  
	 250  func BenchmarkHash512(b *testing.B) {
	 251  	benchmarkSize(b, 512, false)
	 252  }
	 253  
	 254  func BenchmarkHash1K(b *testing.B) {
	 255  	benchmarkSize(b, 1024, false)
	 256  }
	 257  
	 258  func BenchmarkHash8K(b *testing.B) {
	 259  	benchmarkSize(b, 8192, false)
	 260  }
	 261  
	 262  func BenchmarkHash1M(b *testing.B) {
	 263  	benchmarkSize(b, 1024*1024, false)
	 264  }
	 265  
	 266  func BenchmarkHash8M(b *testing.B) {
	 267  	benchmarkSize(b, 8*1024*1024, false)
	 268  }
	 269  
	 270  func BenchmarkHash8BytesUnaligned(b *testing.B) {
	 271  	benchmarkSize(b, 8, true)
	 272  }
	 273  
	 274  func BenchmarkHash1KUnaligned(b *testing.B) {
	 275  	benchmarkSize(b, 1024, true)
	 276  }
	 277  
	 278  func BenchmarkHash8KUnaligned(b *testing.B) {
	 279  	benchmarkSize(b, 8192, true)
	 280  }
	 281  

View as plain text