icz*_*cza 23

甲通用唯一标识符(UUID)是一个128位的值,它是16个字节.对于人类可读的显示,许多系统使用带有插入的连字符的十六进制文本的规范格式,例如:

123e4567-e89b-12d3-a456-426655440000
Run Code Online (Sandbox Code Playgroud)
16*2 + 4 = 36
fmt.Printf("%x\n", uuid)
fmt.Println(hex.EncodeToString(uuid))

// Output: 32 chars
123e4567e89b12d3a456426655440000
123e4567e89b12d3a456426655440000
Run Code Online (Sandbox Code Playgroud)

您可以选择使用base32编码(使用1个符号编码5位,而使用1位符号编码4位的十六进制编码):

fmt.Println(base32.StdEncoding.EncodeToString(uuid))

// Output: 26 chars
CI7EKZ7ITMJNHJCWIJTFKRAAAA======
Run Code Online (Sandbox Code Playgroud)
="======"base32.StdEncoding.DecodeString()

如果这对你来说仍然太长,你可以使用base64编码(用1个符号编码6位):

fmt.Println(base64.RawURLEncoding.EncodeToString(uuid))

// Output: 22 chars
Ej5FZ-ibEtOkVkJmVUQAAA
Run Code Online (Sandbox Code Playgroud)
base64.RawURLEncoding[0-9a-zA-Z]-_
[0-9a-zA-Z]

解释,转义字符串

如果您对这两个额外字符不熟悉,则可以选择将base64字符串转换为解释后的转义字符串,类似于Go中解释的字符串文字.例如,如果要在解释的字符串文字中插入反斜杠,则必须将其加倍,因为反斜杠是指示序列的特殊字符,例如:

fmt.Println("One backspace: \\") // Output: "One backspace: \"
Run Code Online (Sandbox Code Playgroud)
9
base64.RawURLEncodingA..Za..z0..9-_9999
9  =>  99
-  =>  90
_  =>  91
Run Code Online (Sandbox Code Playgroud)
strings.Replacer
var escaper = strings.NewReplacer("9", "99", "-", "90", "_", "91")
Run Code Online (Sandbox Code Playgroud)

并使用它:

fmt.Println(escaper.Replace(base64.RawURLEncoding.EncodeToString(uuid)))

// Output:
Ej5FZ90ibEtOkVkJmVUQAAA
Run Code Online (Sandbox Code Playgroud)
[0-9a-zA-Z]23
9A
strings.Replacer
var unescaper = strings.NewReplacer("99", "9", "90", "-", "91", "_")
Run Code Online (Sandbox Code Playgroud)

解码转义的base64字符串的示例代码:

fmt.Println("Verify decoding:")
s := escaper.Replace(base64.RawURLEncoding.EncodeToString(uuid))
dec, err := base64.RawURLEncoding.DecodeString(unescaper.Replace(s))
fmt.Printf("%x, %v\n", dec, err)
Run Code Online (Sandbox Code Playgroud)

输出:

123e4567e89b12d3a456426655440000, <nil>
Run Code Online (Sandbox Code Playgroud)

试试Go Playground上的所有例子.

  • 那个好漂亮。我不知道`base64.RawURLEncoding`和最后的一线替换短划线和下划线可能肯定对某些人有用。感谢您的详细回答。 (2认同)