一、本地ID生成器
(一)uuid
uuid有两种包:
-
github.com/google/uuid ,仅支持V1和V4版本。
-
github.com/gofrs/uuid ,支持全部五个版本。
下面简单说下五种版本的区别:
-
Version 1,基于mac地址、时间戳。
-
Version 2,based on timestamp,MAC address and POSIX UID/GID (DCE 1.1)
-
Version 3,Hash获取入参并对结果进行MD5。
-
Version 4,纯随机数。
-
Version 5,based on SHA-1 hashing of a named value。
特点
-
5个版本可供选择。
-
定长36字节,偏长。
-
无序。
package mian
import (
"github.com/gofrs/uuid"
"fmt"
)
func main() {
// Version 1:时间+Mac地址
id, err := uuid.NewV1()
if err != nil {
fmt.Printf("uuid NewUUID err:%+v", err)
}
// id: f0629b9a-0cee-11ed-8d44-784f435f60a4 length: 36
fmt.Println("id:", id.String(), "length:", len(id.String()))
// Version 4:是纯随机数,error会在内部报panic
id, err = uuid.NewV4()
if err != nil {
fmt.Printf("uuid NewUUID err:%+v", err)
}
// id: 3b4d1268-9150-447c-a0b7-bbf8c271f6a7 length: 36
fmt.Println("id:", id.String(), "length:", len(id.String()))
}
(二)shortuuid
初始值基于uuid Version4;第二步根据alphabet变量长度(定长57)计算id长度(定长22);第三步依次用DivMod(欧几里得除法和模)返回值与alphabet做映射