cosmium/internal/resourceid/resourceid.go

42 lines
820 B
Go

package resourceid
import (
"encoding/base64"
"math/rand"
"github.com/google/uuid"
)
func New() string {
id := uuid.New().ID()
idBytes := uintToBytes(id)
// first byte should be bigger than 0x80 for collection ids
// clients classify this id as "user" otherwise
if (idBytes[0] & 0x80) <= 0 {
idBytes[0] = byte(rand.Intn(0x80) + 0x80)
}
return base64.StdEncoding.EncodeToString(idBytes)
}
func NewCombined(ids ...string) string {
combinedIdBytes := make([]byte, 0)
for _, id := range ids {
idBytes, _ := base64.StdEncoding.DecodeString(id)
combinedIdBytes = append(combinedIdBytes, idBytes...)
}
return base64.StdEncoding.EncodeToString(combinedIdBytes)
}
func uintToBytes(id uint32) []byte {
buf := make([]byte, 4)
for i := 0; i < 4; i++ {
buf[i] = byte(id >> (i * 8))
}
return buf
}