crc.go 661 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package needle
  2. import (
  3. "crypto/md5"
  4. "fmt"
  5. "github.com/chrislusf/seaweedfs/weed/util"
  6. "github.com/klauspost/crc32"
  7. )
  8. var table = crc32.MakeTable(crc32.Castagnoli)
  9. type CRC uint32
  10. func NewCRC(b []byte) CRC {
  11. return CRC(0).Update(b)
  12. }
  13. func (c CRC) Update(b []byte) CRC {
  14. return CRC(crc32.Update(uint32(c), table, b))
  15. }
  16. func (c CRC) Value() uint32 {
  17. return uint32(c>>15|c<<17) + 0xa282ead8
  18. }
  19. func (n *Needle) Etag() string {
  20. bits := make([]byte, 4)
  21. util.Uint32toBytes(bits, uint32(n.Checksum))
  22. return fmt.Sprintf("%x", bits)
  23. }
  24. func (n *Needle) MD5() string {
  25. hash := md5.New()
  26. hash.Write(n.Data)
  27. return fmt.Sprintf("%x", hash.Sum(nil))
  28. }