clavitor/clovis/clovis-vault/lib/id.go

42 lines
1.0 KiB
Go

package lib
import (
"crypto/sha256"
"encoding/binary"
"fmt"
"path/filepath"
"strconv"
"github.com/google/uuid"
)
// NewID generates a new int64 ID by partial-hashing a UUID.
func NewID() int64 {
u := uuid.New()
h := sha256.Sum256(u[:])
return int64(binary.BigEndian.Uint64(h[:8]) & 0x7FFFFFFFFFFFFFFF)
}
// IDToHex converts an int64 ID to a 16-char lowercase hex string.
func IDToHex(id int64) string {
return fmt.Sprintf("%016x", id)
}
// HexToID parses a 16-char hex string into an int64 ID.
func HexToID(s string) (int64, error) {
if len(s) != 16 {
return 0, fmt.Errorf("invalid id: must be 16 hex chars, got %d", len(s))
}
v, err := strconv.ParseUint(s, 16, 64)
if err != nil {
return 0, fmt.Errorf("invalid id: %w", err)
}
return int64(v), nil
}
// VaultDBPath returns the path to a vault's SQLite file.
// Filename is the upper 32 bits of vault_id as 8-char hex.
func VaultDBPath(dataDir string, vaultID int64) string {
return filepath.Join(dataDir, fmt.Sprintf("%08x.db", uint32(vaultID>>32)))
}