README.md
2.46 Kb · 75 lines
v0 - Unaudited This is an initial version of this package that has not yet been formally audited. A fully audited version will be published as a subsequent release. Use in production at your own risk.
seqid - Sequential IDs
Sequential ID generator producing ordered binary and string representations suitable for use as AVL tree keys. String IDs use cford32's compact encoding and preserve lexicographic ordering.
Usage
1import (
2 "gno.land/p/nt/avl/v0"
3 "gno.land/p/nt/seqid/v0"
4)
5
6var (
7 id seqid.ID
8 users avl.Tree
9)
10
11func NewUser(name string) {
12 user := &User{Name: name}
13
14 // String() is human-friendly and preserves ordering.
15 users.Set(id.Next().String(), user)
16
17 // Or persist the binary form as a fixed-width 8-byte AVL key.
18 users.Set(id.Next().Binary(), user)
19}
20
21// Recover an ID from user input (case-insensitive, sanitized).
22func Lookup(raw string) (seqid.ID, error) {
23 return seqid.FromString(raw)
24}
API
1// An ID is a sequential ID. The zero value is valid; the first
2// Next() call returns 1.
3type ID uint64
4
5// Next advances the ID and returns the new value. Panics on overflow.
6func (i *ID) Next() ID
7
8// TryNext is like Next but returns false instead of panicking on overflow.
9func (i *ID) TryNext() (ID, bool)
10
11// Binary returns a fixed 8-byte big-endian encoding of the ID, suitable
12// as an AVL key. Lexicographic order matches numeric order.
13func (i ID) Binary() string
14
15// String returns the cford32 compact encoding of the ID: 7 bytes for
16// IDs in [0, 2^34), 13 bytes after that. Lexicographic order matches
17// numeric order across the rollover.
18func (i ID) String() string
19
20// FromBinary parses a value produced by Binary.
21func FromBinary(b string) (ID, bool)
22
23// FromString parses a cford32-encoded ID. Case-insensitive; maps
24// I/L to 1 and O to 0. Always re-encode user input via FromString
25// then String() before using it as a key.
26func FromString(b string) (ID, error)
Notes
Binary()is the cheapest and most compact key (8 bytes, fixed width). Prefer it for internal storage. The keys work with anyITree(gno.land/p/nt/avl/v0orgno.land/p/nt/bptree/v0); their monotonic order suits bptree's append path especially well.String()is human-friendly and URL-safe; use it for IDs surfaced to users.- Because cford32 accepts multiple spellings for the same value, always normalize external input through
FromStringthenString()before using it as a lookup key.