package shortid import ( "bytes" "encoding/base64" "encoding/binary" "errors" ) // EncodeID 将 uint64 雪花 ID 编码为短字符串(推荐) // 使用 Base64 URL 安全编码,结果长度约 11 字符 func EncodeID(id uint64) string { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, id) return base64.RawURLEncoding.EncodeToString(buf) } // DecodeID 解码短字符串为 uint64 func DecodeID(s string) (uint64, error) { data, err := base64.RawURLEncoding.DecodeString(s) if err != nil { return 0, err } if len(data) > 8 { return 0, errors.New("数据过长") } // 补齐到 8 字节 buf := make([]byte, 8) copy(buf[8-len(data):], data) return binary.BigEndian.Uint64(buf), nil } // EncodeIDCompact 紧凑编码(去除前导零,适合小 ID) func EncodeIDCompact(id uint64) string { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, id) // 去除前导零 trimmed := bytes.TrimLeft(buf, "\x00") if len(trimmed) == 0 { trimmed = []byte{0} } return base64.RawURLEncoding.EncodeToString(trimmed) } // DecodeIDCompact 解码紧凑编码 func DecodeIDCompact(s string) (uint64, error) { data, err := base64.RawURLEncoding.DecodeString(s) if err != nil { return 0, err } // 还原到 8 字节 buf := make([]byte, 8) copy(buf[8-len(data):], data) return binary.BigEndian.Uint64(buf), nil } // GenerateMeshSeedPrefix 生成 MeshSeed TXT 记录前缀 // 格式:_meshray.{encoded_id} func GenerateMeshSeedPrefix(networkID uint64) string { shortID := EncodeID(networkID) return "_meshray." + shortID } // ExtractNetworkID 从 TXT 记录前缀提取网络 ID func ExtractNetworkID(prefix string) (uint64, error) { // 格式:_meshray.{encoded_id} if len(prefix) <= 9 || prefix[:9] != "_meshray." { return 0, errors.New("非标准前缀格式") } encodedID := prefix[9:] // 提取 _meshray. 后面的部分 return DecodeID(encodedID) }