mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 11:52:24 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			136 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package hashenc
 | |
| 
 | |
| import (
 | |
| 	"crypto/md5"
 | |
| 	"crypto/sha1"
 | |
| 	"crypto/sha256"
 | |
| 	"crypto/sha512"
 | |
| 	"hash"
 | |
| 	"sync"
 | |
| )
 | |
| 
 | |
| // Hash defines a pooled hash.Hash implementation
 | |
| type Hash interface {
 | |
| 	// Hash ensures we implement the base hash.Hash implementation
 | |
| 	hash.Hash
 | |
| 
 | |
| 	// Release resets the Hash and places it back in the pool
 | |
| 	Release()
 | |
| }
 | |
| 
 | |
| // poolHash is our Hash implementation, providing a hash.Hash and a pool to return to
 | |
| type poolHash struct {
 | |
| 	hash.Hash
 | |
| 	pool *sync.Pool
 | |
| }
 | |
| 
 | |
| func (h *poolHash) Release() {
 | |
| 	h.Reset()
 | |
| 	h.pool.Put(h)
 | |
| }
 | |
| 
 | |
| // SHA512Pool defines a pool of SHA512 hashes
 | |
| type SHA512Pool interface {
 | |
| 	// SHA512 returns a Hash implementing the SHA512 hashing algorithm
 | |
| 	SHA512() Hash
 | |
| }
 | |
| 
 | |
| // NewSHA512Pool returns a new SHA512Pool implementation
 | |
| func NewSHA512Pool() SHA512Pool {
 | |
| 	p := &sha512Pool{}
 | |
| 	p.New = func() interface{} {
 | |
| 		return &poolHash{
 | |
| 			Hash: sha512.New(),
 | |
| 			pool: &p.Pool,
 | |
| 		}
 | |
| 	}
 | |
| 	return p
 | |
| }
 | |
| 
 | |
| // sha512Pool is our SHA512Pool implementation, simply wrapping sync.Pool
 | |
| type sha512Pool struct {
 | |
| 	sync.Pool
 | |
| }
 | |
| 
 | |
| func (p *sha512Pool) SHA512() Hash {
 | |
| 	return p.Get().(Hash)
 | |
| }
 | |
| 
 | |
| // SHA256Pool defines a pool of SHA256 hashes
 | |
| type SHA256Pool interface {
 | |
| 	// SHA256 returns a Hash implementing the SHA256 hashing algorithm
 | |
| 	SHA256() Hash
 | |
| }
 | |
| 
 | |
| // NewSHA256Pool returns a new SHA256Pool implementation
 | |
| func NewSHA256Pool() SHA256Pool {
 | |
| 	p := &sha256Pool{}
 | |
| 	p.New = func() interface{} {
 | |
| 		return &poolHash{
 | |
| 			Hash: sha256.New(),
 | |
| 			pool: &p.Pool,
 | |
| 		}
 | |
| 	}
 | |
| 	return p
 | |
| }
 | |
| 
 | |
| // sha256Pool is our SHA256Pool implementation, simply wrapping sync.Pool
 | |
| type sha256Pool struct {
 | |
| 	sync.Pool
 | |
| }
 | |
| 
 | |
| func (p *sha256Pool) SHA256() Hash {
 | |
| 	return p.Get().(Hash)
 | |
| }
 | |
| 
 | |
| // SHA1Pool defines a pool of SHA1 hashes
 | |
| type SHA1Pool interface {
 | |
| 	SHA1() Hash
 | |
| }
 | |
| 
 | |
| // NewSHA1Pool returns a new SHA1Pool implementation
 | |
| func NewSHA1Pool() SHA1Pool {
 | |
| 	p := &sha1Pool{}
 | |
| 	p.New = func() interface{} {
 | |
| 		return &poolHash{
 | |
| 			Hash: sha1.New(),
 | |
| 			pool: &p.Pool,
 | |
| 		}
 | |
| 	}
 | |
| 	return p
 | |
| }
 | |
| 
 | |
| // sha1Pool is our SHA1Pool implementation, simply wrapping sync.Pool
 | |
| type sha1Pool struct {
 | |
| 	sync.Pool
 | |
| }
 | |
| 
 | |
| func (p *sha1Pool) SHA1() Hash {
 | |
| 	return p.Get().(Hash)
 | |
| }
 | |
| 
 | |
| // MD5Pool defines a pool of MD5 hashes
 | |
| type MD5Pool interface {
 | |
| 	MD5() Hash
 | |
| }
 | |
| 
 | |
| // NewMD5Pool returns a new MD5 implementation
 | |
| func NewMD5Pool() MD5Pool {
 | |
| 	p := &md5Pool{}
 | |
| 	p.New = func() interface{} {
 | |
| 		return &poolHash{
 | |
| 			Hash: md5.New(),
 | |
| 			pool: &p.Pool,
 | |
| 		}
 | |
| 	}
 | |
| 	return p
 | |
| }
 | |
| 
 | |
| // md5Pool is our MD5Pool implementation, simply wrapping sync.Pool
 | |
| type md5Pool struct {
 | |
| 	sync.Pool
 | |
| }
 | |
| 
 | |
| func (p *md5Pool) MD5() Hash {
 | |
| 	return p.Get().(Hash)
 | |
| }
 |