33 lines
742 B
Go
33 lines
742 B
Go
package ids
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/base32"
|
|
"time"
|
|
)
|
|
|
|
var encoding = base32.NewEncoding("0123456789ABCDEFGHJKMNPQRSTVWXYZ").WithPadding(base32.NoPadding)
|
|
|
|
func Repository() (string, error) {
|
|
return newID("RP_")
|
|
}
|
|
|
|
func Prompt() (string, error) {
|
|
return newID("PM_")
|
|
}
|
|
|
|
func newID(prefix string) (string, error) {
|
|
value := make([]byte, 16)
|
|
milliseconds := uint64(time.Now().UnixMilli())
|
|
value[0] = byte(milliseconds >> 40)
|
|
value[1] = byte(milliseconds >> 32)
|
|
value[2] = byte(milliseconds >> 24)
|
|
value[3] = byte(milliseconds >> 16)
|
|
value[4] = byte(milliseconds >> 8)
|
|
value[5] = byte(milliseconds)
|
|
if _, err := rand.Read(value[6:]); err != nil {
|
|
return "", err
|
|
}
|
|
return prefix + encoding.EncodeToString(value), nil
|
|
}
|