go 生成uuid 与随机数
对于Golang生成随机字符串这件事情很蛋疼。
对于伪随机字符串(会永久的生成同一个随机字符串)
func RandStr(length int) string { var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") b := make([]rune, length) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) }
这样生成的随机字符串是永久的同样的字符串。 下面,我演进了一个方案,同样是用的math/rand包里的方法来实现的
func RandStr(length int) string { str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" bytes := []byte(str) result := []byte{} rand.Seed(time.Now().UnixNano()+ int64(rand.Intn(100))) for i := 0; i < length; i++ { result = append(result, bytes[rand.Intn(len(bytes))]) } return string(result) }
这个方法是以时间戳作为seed,然后再加上一个随机数,来作为随机因子来进行随机。 用了这个方法时候,直接就一库了。这个方法重复的概率极低。如果是平常的注册用户来用的话,基本上就不用担心了。
当然也可以用crypto/rand 这个包来实现,由于我已经实现了极低概率的随机字符串就没看了,有兴趣的小伙伴可以自己去实现(抄)一下。 参考地址:http://ju.outofmemory.cn/entry/221647
import "github.com/google/uuid"
uuid := uuid.New()
key := uuid.String()
在本教程中,了解了如何在golang中使用go.uuid和google.uuid包生成GUID。
唯一标识符是一个唯一的字符串,用来表示软件应用中的信息。
在应用程序中使用两种类型的唯一标识符:
UUID
- 普遍唯一的标识符。GUID
- 全局唯一标识符
这些在数据库中用于列,作为MongoDB或SQL数据库的主键。而且还可以在前端应用程序中存储cookie或session-id。
UUID
或 GUID
是别名,两者所指相同,包含16个字节或128位的大小,由连字符分隔成5组。
在Go语言中,我们有多种方法可以生成唯一的标识符
在这个例子中,我们将使用google/uuid
包来生成uuid。
链接:https://juejin.cn/post/7118936771760488462
简介
UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中心节点指定,无需考虑数据库创建时的名称重复问题。
目前最广泛应用的 UUID 是 RFC4122 协议规范的,有时 GUID 也特指是微软对标准 UUID 的实现,其实 RFC4122 的作者之一也是微软员工。
规范标准
Universally Unique IDentifier, UUID 是一个 128 位的数字,一般通过 32 个十六进制表示,被连字符分为五段,例如: 00d460f0-ec1a-4a0f-a452-1afb4b5d1686
。详细标准可以参考 RFC4122 。
为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
版本
如上,1 个 UUID 被连字符分为五段,形式为 8-4-4-4-12 的 32 个字符,其中的字母是 16 进制表示,而且大小写无关。
UUID 本身也经过了多个版本的演化,每个版本的算法都不同,其标准格式如下。
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
M: 表示版本号,只会是1 2 3 4 5
N: 只会是 8 9 a b
Version 1, based on timestamp and MAC address (RFC 4122)
Version 2, based on timestamp, MAC address and POSIX UID/GID (DCE 1.1)
Version 3, based on MD5 hashing (RFC 4122)
Version 4, based on random numbers (RFC 4122)
Version 5, based on SHA-1 hashing (RFC 4122)
如下,简单介绍各个版本的实现方法。
-
V1 基于时间
通过当前时间戳、机器 MAC 地址生成,因为 MAC 地址是全球唯一的,从而间接的可以保证 UUID 全球唯一,不过它暴露了电脑的 MAC 地址和生成这个 UUID 的时间,从而一直被诟病。 -
V2 DCE安全
和基于时间的 UUID 算法相同,但会把时间戳的前 4 位置换为 POSIX 的 UID 或 GID,不过这个版本在 UUID 规范中没有明确指定,基本不会实现。 -
V3 基于命名空间
由用户指定一个命名空间和一个具体的字符串,然后通过MD5
散列来生成 UUID 。不过这个版本按照规范描述,主要是是为了向后兼容,所以也很少用到。 -
V4 基于随机数
根据随机数或者伪随机数生成 UUID ,这个版本也是有意或者无意之中 使用最多 的。 -
V5 基于名字空间
其实和版本 3 类似,不过散列函数换成了SHA1
。
package main
import (
"fmt"
"github.com/google/uuid"
"log"
)
func main() {
// V1 基于时间
u1, err := uuid.NewUUID()
if err != nil {
log.Fatal(err)
}
fmt.Println(u1.String())
// V4 基于随机数
u4 := uuid.New()
fmt.Println(u4.String()) // a0d99f20-1dd1-459b-b516-dfeca4005203
}
链接:https://juejin.cn/post/7118936771760488462
在本教程中,了解了如何在golang中使用go.uuid和google.uuid包生成GUID。
唯一标识符是一个唯一的字符串,用来表示软件应用中的信息。
在应用程序中使用两种类型的唯一标识符:
UUID
- 普遍唯一的标识符。GUID
- 全局唯一标识符
这些在数据库中用于列,作为MongoDB或SQL数据库的主键。而且还可以在前端应用程序中存储cookie或session-id。
UUID
或 GUID
是别名,两者所指相同,包含16个字节或128位的大小,由连字符分隔成5组。
在Go语言中,我们有多种方法可以生成唯一的标识符
在这个例子中,我们将使用google/uuid
包来生成uuid。
链接:https://juejin.cn/post/7118936771760488462
参考:
https://cloud.tencent.com/developer/article/1627071
https://www.sunzhongwei.com/golang-uuid-generated
https://studygolang.com/articles/28126
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具