feat: refactor product attributes caching logic and add HashArray utility function
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"hash/fnv"
|
||||
"math"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
)
|
||||
@@ -49,3 +52,74 @@ func DerefSlice[T any](s []*T) []T {
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
type Hashable interface {
|
||||
~int | ~int8 | ~int16 | ~int32 | ~int64 |
|
||||
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 |
|
||||
~string | ~bool | ~float32 | ~float64
|
||||
}
|
||||
|
||||
func HashArray[T Hashable](arr []T) (string, error) {
|
||||
h := fnv.New64a()
|
||||
buf := make([]byte, 8)
|
||||
|
||||
for _, v := range arr {
|
||||
var b []byte
|
||||
|
||||
switch val := any(v).(type) {
|
||||
case int:
|
||||
binary.LittleEndian.PutUint64(buf, uint64(val))
|
||||
b = buf
|
||||
case int8:
|
||||
buf[0] = byte(val)
|
||||
b = buf[:1]
|
||||
case int16:
|
||||
binary.LittleEndian.PutUint16(buf, uint16(val))
|
||||
b = buf[:2]
|
||||
case int32:
|
||||
binary.LittleEndian.PutUint32(buf, uint32(val))
|
||||
b = buf[:4]
|
||||
case int64:
|
||||
binary.LittleEndian.PutUint64(buf, uint64(val))
|
||||
b = buf
|
||||
case uint:
|
||||
binary.LittleEndian.PutUint64(buf, uint64(val))
|
||||
b = buf
|
||||
case uint8:
|
||||
buf[0] = val
|
||||
b = buf[:1]
|
||||
case uint16:
|
||||
binary.LittleEndian.PutUint16(buf, val)
|
||||
b = buf[:2]
|
||||
case uint32:
|
||||
binary.LittleEndian.PutUint32(buf, val)
|
||||
b = buf[:4]
|
||||
case uint64:
|
||||
binary.LittleEndian.PutUint64(buf, val)
|
||||
b = buf
|
||||
case float32:
|
||||
binary.LittleEndian.PutUint32(buf[:4], math.Float32bits(val))
|
||||
b = buf[:4]
|
||||
case float64:
|
||||
binary.LittleEndian.PutUint64(buf, math.Float64bits(val))
|
||||
b = buf
|
||||
case bool:
|
||||
if val {
|
||||
buf[0] = 1
|
||||
} else {
|
||||
buf[0] = 0
|
||||
}
|
||||
b = buf[:1]
|
||||
case string:
|
||||
b = []byte(val)
|
||||
default:
|
||||
return "", fmt.Errorf("unsupported type: %T", val)
|
||||
}
|
||||
|
||||
if _, err := h.Write(b); err != nil {
|
||||
return "", fmt.Errorf("failed to write to hash: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%x", h.Sum64()), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user