1package md5simd
2
3import (
4	"crypto/md5"
5	"hash"
6	"sync"
7)
8
9const (
10	// The blocksize of MD5 in bytes.
11	BlockSize = 64
12
13	// The size of an MD5 checksum in bytes.
14	Size = 16
15
16	// internalBlockSize is the internal block size.
17	internalBlockSize = 32 << 10
18)
19
20type Server interface {
21	NewHash() Hasher
22	Close()
23}
24
25type Hasher interface {
26	hash.Hash
27	Close()
28}
29
30// StdlibHasher returns a Hasher that uses the stdlib for hashing.
31// Used hashers are stored in a pool for fast reuse.
32func StdlibHasher() Hasher {
33	return &md5Wrapper{Hash: md5Pool.New().(hash.Hash)}
34}
35
36// md5Wrapper is a wrapper around the builtin hasher.
37type md5Wrapper struct {
38	hash.Hash
39}
40
41var md5Pool = sync.Pool{New: func() interface{} {
42	return md5.New()
43}}
44
45// fallbackServer - Fallback when no assembly is available.
46type fallbackServer struct {
47}
48
49// NewHash -- return regular Golang md5 hashing from crypto
50func (s *fallbackServer) NewHash() Hasher {
51	return &md5Wrapper{Hash: md5Pool.New().(hash.Hash)}
52}
53
54func (s *fallbackServer) Close() {
55}
56
57func (m *md5Wrapper) Close() {
58	if m.Hash != nil {
59		m.Reset()
60		md5Pool.Put(m.Hash)
61		m.Hash = nil
62	}
63}
64