+// Package sha3pool is a freelist for SHA3-256 hash objects.
+package sha3pool
+
+import (
+ "sync"
+
+ "golang.org/x/crypto/sha3"
+)
+
+var pool = &sync.Pool{New: func() interface{} { return sha3.New256() }}
+
+// Get256 returns an initialized SHA3-256 hash ready to use.
+// It is like sha3.New256 except it uses the freelist.
+// The caller should call Put256 when finished with the returned object.
+func Get256() sha3.ShakeHash {
+ return pool.Get().(sha3.ShakeHash)
+}
+
+// Put256 resets h and puts it in the freelist.
+func Put256(h sha3.ShakeHash) {
+ h.Reset()
+ pool.Put(h)
+}
+
+// Sum256 uses a ShakeHash from the pool to sum into hash.
+func Sum256(hash, data []byte) {
+ h := Get256()
+ h.Write(data)
+ h.Read(hash)
+ Put256(h)
+}