mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 09:22:25 -05:00 
			
		
		
		
	Bumps [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) from 7.0.85 to 7.0.89. - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.85...v7.0.89) --- updated-dependencies: - dependency-name: github.com/minio/minio-go/v7 dependency-version: 7.0.89 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
		
			
				
	
	
		
			180 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright (c) 2025 Minio Inc. All rights reserved.
 | |
| // Use of this source code is governed by a license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| // Package crc64nvme implements the 64-bit cyclic redundancy check with NVME polynomial.
 | |
| package crc64nvme
 | |
| 
 | |
| import (
 | |
| 	"encoding/binary"
 | |
| 	"errors"
 | |
| 	"hash"
 | |
| 	"sync"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	// The size of a CRC-64 checksum in bytes.
 | |
| 	Size = 8
 | |
| 
 | |
| 	// The NVME polynoimial (reversed, as used by Go)
 | |
| 	NVME = 0x9a6c9329ac4bc9b5
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	// precalculated table.
 | |
| 	nvmeTable = makeTable(NVME)
 | |
| )
 | |
| 
 | |
| // table is a 256-word table representing the polynomial for efficient processing.
 | |
| type table [256]uint64
 | |
| 
 | |
| var (
 | |
| 	slicing8TablesBuildOnce sync.Once
 | |
| 	slicing8TableNVME       *[8]table
 | |
| )
 | |
| 
 | |
| func buildSlicing8TablesOnce() {
 | |
| 	slicing8TablesBuildOnce.Do(buildSlicing8Tables)
 | |
| }
 | |
| 
 | |
| func buildSlicing8Tables() {
 | |
| 	slicing8TableNVME = makeSlicingBy8Table(makeTable(NVME))
 | |
| }
 | |
| 
 | |
| func makeTable(poly uint64) *table {
 | |
| 	t := new(table)
 | |
| 	for i := 0; i < 256; i++ {
 | |
| 		crc := uint64(i)
 | |
| 		for j := 0; j < 8; j++ {
 | |
| 			if crc&1 == 1 {
 | |
| 				crc = (crc >> 1) ^ poly
 | |
| 			} else {
 | |
| 				crc >>= 1
 | |
| 			}
 | |
| 		}
 | |
| 		t[i] = crc
 | |
| 	}
 | |
| 	return t
 | |
| }
 | |
| 
 | |
| func makeSlicingBy8Table(t *table) *[8]table {
 | |
| 	var helperTable [8]table
 | |
| 	helperTable[0] = *t
 | |
| 	for i := 0; i < 256; i++ {
 | |
| 		crc := t[i]
 | |
| 		for j := 1; j < 8; j++ {
 | |
| 			crc = t[crc&0xff] ^ (crc >> 8)
 | |
| 			helperTable[j][i] = crc
 | |
| 		}
 | |
| 	}
 | |
| 	return &helperTable
 | |
| }
 | |
| 
 | |
| // digest represents the partial evaluation of a checksum.
 | |
| type digest struct {
 | |
| 	crc uint64
 | |
| }
 | |
| 
 | |
| // New creates a new hash.Hash64 computing the CRC-64 checksum using the
 | |
| // NVME polynomial. Its Sum method will lay the
 | |
| // value out in big-endian byte order. The returned Hash64 also
 | |
| // implements [encoding.BinaryMarshaler] and [encoding.BinaryUnmarshaler] to
 | |
| // marshal and unmarshal the internal state of the hash.
 | |
| func New() hash.Hash64 { return &digest{0} }
 | |
| 
 | |
| func (d *digest) Size() int { return Size }
 | |
| 
 | |
| func (d *digest) BlockSize() int { return 1 }
 | |
| 
 | |
| func (d *digest) Reset() { d.crc = 0 }
 | |
| 
 | |
| const (
 | |
| 	magic         = "crc\x02"
 | |
| 	marshaledSize = len(magic) + 8 + 8
 | |
| )
 | |
| 
 | |
| func (d *digest) MarshalBinary() ([]byte, error) {
 | |
| 	b := make([]byte, 0, marshaledSize)
 | |
| 	b = append(b, magic...)
 | |
| 	b = binary.BigEndian.AppendUint64(b, tableSum)
 | |
| 	b = binary.BigEndian.AppendUint64(b, d.crc)
 | |
| 	return b, nil
 | |
| }
 | |
| 
 | |
| func (d *digest) UnmarshalBinary(b []byte) error {
 | |
| 	if len(b) < len(magic) || string(b[:len(magic)]) != magic {
 | |
| 		return errors.New("hash/crc64: invalid hash state identifier")
 | |
| 	}
 | |
| 	if len(b) != marshaledSize {
 | |
| 		return errors.New("hash/crc64: invalid hash state size")
 | |
| 	}
 | |
| 	if tableSum != binary.BigEndian.Uint64(b[4:]) {
 | |
| 		return errors.New("hash/crc64: tables do not match")
 | |
| 	}
 | |
| 	d.crc = binary.BigEndian.Uint64(b[12:])
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func update(crc uint64, p []byte) uint64 {
 | |
| 	if hasAsm && len(p) > 127 {
 | |
| 		ptr := unsafe.Pointer(&p[0])
 | |
| 		if align := (uintptr(ptr)+15)&^0xf - uintptr(ptr); align > 0 {
 | |
| 			// Align to 16-byte boundary.
 | |
| 			crc = update(crc, p[:align])
 | |
| 			p = p[align:]
 | |
| 		}
 | |
| 		runs := len(p) / 128
 | |
| 		crc = updateAsm(crc, p[:128*runs])
 | |
| 		return update(crc, p[128*runs:])
 | |
| 	}
 | |
| 
 | |
| 	buildSlicing8TablesOnce()
 | |
| 	crc = ^crc
 | |
| 	// table comparison is somewhat expensive, so avoid it for small sizes
 | |
| 	for len(p) >= 64 {
 | |
| 		var helperTable = slicing8TableNVME
 | |
| 		// Update using slicing-by-8
 | |
| 		for len(p) > 8 {
 | |
| 			crc ^= binary.LittleEndian.Uint64(p)
 | |
| 			crc = helperTable[7][crc&0xff] ^
 | |
| 				helperTable[6][(crc>>8)&0xff] ^
 | |
| 				helperTable[5][(crc>>16)&0xff] ^
 | |
| 				helperTable[4][(crc>>24)&0xff] ^
 | |
| 				helperTable[3][(crc>>32)&0xff] ^
 | |
| 				helperTable[2][(crc>>40)&0xff] ^
 | |
| 				helperTable[1][(crc>>48)&0xff] ^
 | |
| 				helperTable[0][crc>>56]
 | |
| 			p = p[8:]
 | |
| 		}
 | |
| 	}
 | |
| 	// For reminders or small sizes
 | |
| 	for _, v := range p {
 | |
| 		crc = nvmeTable[byte(crc)^v] ^ (crc >> 8)
 | |
| 	}
 | |
| 	return ^crc
 | |
| }
 | |
| 
 | |
| // Update returns the result of adding the bytes in p to the crc.
 | |
| func Update(crc uint64, p []byte) uint64 {
 | |
| 	return update(crc, p)
 | |
| }
 | |
| 
 | |
| func (d *digest) Write(p []byte) (n int, err error) {
 | |
| 	d.crc = update(d.crc, p)
 | |
| 	return len(p), nil
 | |
| }
 | |
| 
 | |
| func (d *digest) Sum64() uint64 { return d.crc }
 | |
| 
 | |
| func (d *digest) Sum(in []byte) []byte {
 | |
| 	s := d.Sum64()
 | |
| 	return append(in, byte(s>>56), byte(s>>48), byte(s>>40), byte(s>>32), byte(s>>24), byte(s>>16), byte(s>>8), byte(s))
 | |
| }
 | |
| 
 | |
| // Checksum returns the CRC-64 checksum of data
 | |
| // using the NVME polynomial.
 | |
| func Checksum(data []byte) uint64 { return update(0, data) }
 | |
| 
 | |
| // ISO tablesum of NVME poly
 | |
| const tableSum = 0x8ddd9ee4402c7163
 |