1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- package main
- import (
- "context"
- "crypto/sha256"
- "encoding/hex"
- "encoding/json"
- "hash"
- "sync"
- )
- type eTagCalc struct {
- hash hash.Hash
- enc *json.Encoder
- }
- var eTagCalcPool = sync.Pool{
- New: func() interface{} {
- h := sha256.New()
- enc := json.NewEncoder(h)
- enc.SetEscapeHTML(false)
- enc.SetIndent("", "")
- return &eTagCalc{h, enc}
- },
- }
- func calcETag(ctx context.Context) string {
- c := eTagCalcPool.Get().(*eTagCalc)
- defer eTagCalcPool.Put(c)
- c.hash.Reset()
- c.hash.Write(getImageData(ctx).Data)
- footprint := c.hash.Sum(nil)
- c.hash.Reset()
- c.hash.Write(footprint)
- c.hash.Write([]byte(version))
- c.enc.Encode(conf)
- c.enc.Encode(getProcessingOptions(ctx))
- return hex.EncodeToString(c.hash.Sum(nil))
- }
|