package fst import ( "crypto/rand" "encoding/hex" "errors" "fmt" ) type ID [16]byte var ( ErrInvalidLength = errors.New("string representation must have a length of 32") ) func (a *ID) String() string { return hex.EncodeToString(a[:]) } func NewAppID(id *ID) error { _, err := rand.Read(id[:]) return err } func ParseAppID(id *ID, s string) error { if len(s) != 32 { return ErrInvalidLength } for i, b := range s { if b < '0' || b > 'f' { return fmt.Errorf("invalid char %q at byte %d", b, i) } v := uint8(b) if v > '9' { v = 10 + v - 'a' } else { v -= '0' } if i%2 == 0 { v <<= 4 } id[i/2] += v } return nil }