Versions in this module Expand all Collapse all v0 v0.7.0 Jul 4, 2026 Changes in this version + func HashHex(username string) (string, error) + type HashCandidate struct + Hash UsernameHash + HashHex string + Username string + func CandidatesWithHashes(nickname string, limits NicknameLimits) ([]HashCandidate, error) + func CandidatesWithHashesFromReader(r io.Reader, nickname string, limits NicknameLimits) ([]HashCandidate, error) type Username + func (u Username) Hash() (UsernameHash, error) type UsernameHash + func Hash(username string) (UsernameHash, error) + func HashFromParts(nickname string, discriminator uint64) (UsernameHash, error) v0.6.0 Jul 2, 2026 Changes in this version type Username + func (u Username) ReserveHash() (UsernameHash, error) + type UsernameHash [32]byte + func ReserveUsernameHash(username string) (UsernameHash, error) + func (h UsernameHash) Bytes() [32]byte + func (h UsernameHash) String() string v0.5.0 Jul 1, 2026 v0.4.0 Jul 1, 2026 v0.3.0 Jun 30, 2026 Changes in this version + const LinkEntropySize + var ErrBadCiphertext = errors.New("bad username link ciphertext") + var ErrBadDiscriminatorCharacter = errors.New("bad discriminator character") + var ErrBadNicknameCharacter = errors.New("bad nickname character") + var ErrDiscriminatorCannotBeEmpty = errors.New("discriminator cannot be empty") + var ErrDiscriminatorCannotBeSingleDigit = errors.New("discriminator cannot be a single digit") + var ErrDiscriminatorCannotBeZero = errors.New("discriminator cannot be zero") + var ErrDiscriminatorCannotHaveLeadingZeros = errors.New("discriminator cannot have leading zeros") + var ErrDiscriminatorTooLarge = errors.New("discriminator too large") + var ErrHMACMismatch = errors.New("username link hmac mismatch") + var ErrInputDataTooLong = errors.New("username link input data too long") + var ErrInvalidDecryptedDataStructure = errors.New("invalid username link decrypted data") + var ErrInvalidEntropyDataLength = errors.New("invalid username link entropy length") + var ErrMissingSeparator = errors.New("username must contain a separator") + var ErrNicknameCannotBeEmpty = errors.New("nickname cannot be empty") + var ErrNicknameCannotStartWithDigit = errors.New("nickname cannot start with digit") + var ErrNicknameTooLong = errors.New("nickname too long") + var ErrNicknameTooShort = errors.New("nickname too short") + var ErrUsernameLinkDataTooShort = errors.New("username link data too short") + func CandidatesFrom(nickname string, limits NicknameLimits) ([]string, error) + func CandidatesFromReader(r io.Reader, nickname string, limits NicknameLimits) ([]string, error) + func DecryptUsername(entropy [LinkEntropySize]byte, encryptedUsername []byte) (string, error) + type Link struct + EncryptedUsername []byte + Entropy [LinkEntropySize]byte + func CreateLink(username string, entropy *[LinkEntropySize]byte) (Link, error) + func CreateLinkFromReader(r io.Reader, username string, entropy *[LinkEntropySize]byte) (Link, error) + func ParseLinkBuffer(buf []byte) (Link, error) + func (l Link) Buffer() []byte + type NicknameLimits struct + Max int + Min int + func DefaultNicknameLimits() NicknameLimits + func NewNicknameLimits(minLen, maxLen int) NicknameLimits + func (l NicknameLimits) Validate(n int) error + type Username struct + func FromParts(nickname, discriminator string, limits NicknameLimits) (Username, error) + func Parse(s string) (Username, error) + func (u Username) Discriminator() uint64 + func (u Username) Nickname() string + func (u Username) String() string