gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

md5.go (1122B)


      1 package md5simd
      2 
      3 import (
      4 	"crypto/md5"
      5 	"hash"
      6 	"sync"
      7 )
      8 
      9 const (
     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 
     20 type Server interface {
     21 	NewHash() Hasher
     22 	Close()
     23 }
     24 
     25 type 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.
     32 func StdlibHasher() Hasher {
     33 	return &md5Wrapper{Hash: md5Pool.New().(hash.Hash)}
     34 }
     35 
     36 // md5Wrapper is a wrapper around the builtin hasher.
     37 type md5Wrapper struct {
     38 	hash.Hash
     39 }
     40 
     41 var md5Pool = sync.Pool{New: func() interface{} {
     42 	return md5.New()
     43 }}
     44 
     45 // fallbackServer - Fallback when no assembly is available.
     46 type fallbackServer struct {
     47 }
     48 
     49 // NewHash -- return regular Golang md5 hashing from crypto
     50 func (s *fallbackServer) NewHash() Hasher {
     51 	return &md5Wrapper{Hash: md5Pool.New().(hash.Hash)}
     52 }
     53 
     54 func (s *fallbackServer) Close() {
     55 }
     56 
     57 func (m *md5Wrapper) Close() {
     58 	if m.Hash != nil {
     59 		m.Reset()
     60 		md5Pool.Put(m.Hash)
     61 		m.Hash = nil
     62 	}
     63 }