ksuid 是一个高效、全面、经过实战检验的 Go 库,用于生成和解析一种特定类型的全局唯一标识符,称为 KSUID。这个库作为其参考实现。
go get -u github.com/segmentio/ksuid
KSUID 代表可排序的唯一标识符(K-Sortable Unique IDentifier)。它是一种类似于 RFC 4122 UUID 的全局唯一标识符,从底层设计 上就能够按生成时间戳"自然"排序,无需任何特殊的类型感知逻辑。
简而言之,通过 UNIX sort 命令对一组 KSUID 进行排序,将得到按生成时间排序的列表。
生成唯一标识符的方法有很多,为什么选择 KSUID?
即使这些特性中只有一个对你很重要,KSUID 也是一个很好的选择!:) 许多项目选择使用 KSUID 仅仅 是因为其文本表示形式便于复制粘贴。
关于这个主题的后续阅读:UUID 的简史
与更常见的 UUIDv4 不同,KSUID 包含一个时间戳组件,允许它们按生成时间松散排序。这不是一个强保证(不变量),因为它依赖于挂钟时间,但在实践中仍然非常有用。二进制和文本表示形式都可以按创建时间排序,无需任何特殊的排序逻辑。
虽然 RFC 4122 UUIDv1 确实 包含时间组件,但没有足够的随机字节来提供强有力的防冲突(重复)保护。由于熵如此之低,恶意方可能会猜测生成的 ID,这对于那些安全性隐含或明确地对对手猜测标识符敏感的系统来说是个问题。
为了适应 64 位数字空间,Snowflake ID 及其衍生物需要协调以避免冲突,这显著增加了部署复杂性和操作负担。
KSUID 包含 128 位伪随机数据("熵")。这个数字空间比广泛接受的 RFC 4122 UUIDv4 标准使用的 122 位大 64 倍。额外的时间戳组件可以被视为"额外熵",进一步降低了冲突的概率,在任何实际实现中都达到了物理上不可能的程度。
文本 和 二进制表示形式都可以按字典顺序排序,这允许它们被放入不原生支持 KSUID 的系统中,并保留其时间排序属性。
文本表示是字母数字 base62 编码,所以它可以"适应"任何接受字母数字字符串的地方。不使用分隔符,因此当被设计用于人类可读文本的软件解释时,字符串化的 KSUID 不会被无意中截断或标记化,这是 RFC 4122 UUID 文本表示的一个常见问题。
二进制 KSUID 是 20 字节:32 位无符号整数 UTC 时间戳和 128 位随机生成的有效负载。时间戳使用大端编码,以支持字典排序。时间戳纪元调整到 2014 年 5 月 13 日,提供超过 100 年的生命周期。有效负载由加密强度的伪随机数生成器生成。
文本表示始终是 27 个字符,以字母数字 base62 编码,将按时间戳进行字典排序。
这个库设计用于性能关键的代码路径。其代码已经过优化,以消除所有非必要的开销。KSUID 类型派生自固定大小的数组,这消除了涉及可变宽度类型的额外引用追踪和分配。
API 提供了一个接口,用于对分配敏感的代码路径。例如,Append 方法可用于解析文本表示并替换 KSUID 值的内容,而无需额外的堆分配。
所有公共包级别的"纯"函数都是并发安全的,由全局互斥锁保护。对于从单个 Goroutine 生成大量 KSUID 的热循环,提供了 Sequence 类型以消除潜在的争用。
默认情况下,出于谨慎考虑,使用加密安全的 PRNG 来生成 KSUID 的随机位。在极度关注性能的代码中,可以使用包含的 FastRander 类型来放宽这一要求。FastRander 使用标准 PRNG,种子由加密安全 PRNG 生成。
注意: 虽然没有证据表明 FastRander 会增加冲突的概率,但在唯一性对安全性很重要的场景中不应使用它,因为对手预测生成的 ID 的机会增加。
这段代码已在 Segment 的生产环境中使用了多年,跨越了多样化的项目。在 Segment 一些最关键性能、大规模分布式系统中,已经生成了数万亿个 KSUID。
设计用于与其他库集成,KSUID 类型实现了许多标准库接口,包括:
Stringerdatabase/sql.Scanner 和 database/sql/driver.Valuerencoding.BinaryMarshal 和 encoding.BinaryUnmarshalencoding.TextMarshal 和 encoding.TextUnmarshal
(encoding/json 友好!)此软件包附带一个命令行工具 ksuid,用于生成 KSUID 以及检查现有 KSUID 的内部组件。它提供机器友好的输出,适用于脚本编写场景。
在 Go 构建环境中,可以使用以下命令安装:
$ go install github.com/segmentio/ksuid/cmd/ksuid
$ ksuid 0ujsswThIGTUYm2K8FjOOfXtY1K
$ ksuid -n 4 0ujsszwN8NRY24YaXiTIE2VWDTS 0ujsswThIGTUYm2K8FjOOfXtY1K 0ujssxh0cECutqzMgbtXSGnjorm 0ujsszgFvbiEr7CDgE3z8MAUPFt
$ ksuid -f inspect 0ujtsYcgvSTl8PAuAdqWYSMnLOv 表示形式: 字符串: 0ujtsYcgvSTl8PAuAdqWYSMnLOv 原始: 0669F7EFB5A1CD34B5F99D1154FB6853345C9735 组件: 时间: 2017-10-09 21:00:47 -0700 PDT 时间戳: 107608047 有效载荷: B5A1CD34B5F99D1154FB6853345C9735
$ ksuid -f inspect 表示形式: 字符串: 0ujzPyRiIAffKhBux4PvQdDqMHY 原始: 066A029C73FC1AA3B2446246D6E89FCD909E8FE8 组件: 时间: 2017-10-09 21:46:20 -0700 PDT 时间戳: 107610780 有效载荷: 73FC1AA3B2446246D6E89FCD909E8FE8
$ ksuid -f template -t '{{ .Time }}: {{ .Payload }}' 0ujtsYcgvSTl8PAuAdqWYSMnLOv 2017-10-09 21:00:47 -0700 PDT: B5A1CD34B5F99D1154FB6853345C9735
$ ksuid -f template -t '{{ .Time }}: {{ .Payload }}' $(ksuid -n 4) 2017-10-09 21:05:37 -0700 PDT: 304102BC687E087CC3A811F21D113CCF 2017-10-09 21:05:37 -0700 PDT: EAF0B240A9BFA55E079D887120D962F0 2017-10-09 21:05:37 -0700 PDT: DF0761769909ABB0C7BB9D66F79FC041 2017-10-09 21:05:37 -0700 PDT: 1A8F0E3D0BDEB84A5FAD702876F46543
$ ksuid -f template -t '{ "timestamp": "{{ .Timestamp }}", "payload": "{{ .Payload }}", "ksuid": "{{.String}}"}' -n 4 { "timestamp": "107611700", "payload": "9850EEEC191BF4FF26F99315CE43B0C8", "ksuid": "0uk1Hbc9dQ9pxyTqJ93IUrfhdGq"} { "timestamp": "107611700", "payload": "CC55072555316F45B8CA2D2979D3ED0A", "ksuid": "0uk1HdCJ6hUZKDgcxhpJwUl5ZEI"} { "timestamp": "107611700", "payload": "BA1C205D6177F0992D15EE606AE32238", "ksuid": "0uk1HcdvF0p8C20KtTfdRSB9XIm"} { "timestamp": "107611700", "payload": "67517BA309EA62AE7991B27BB6F2FCAC", "ksuid": "0uk1Ha7hGJ1Q9Xbnkt0yZgNwg3g"}
有时你确信你的 ksuid 是正确的,但你需要从字节或字符串中获取它并将其传递给结构体。为此,有 OrNil 函数在出错时返回 ksuid.Nil,可以直接在结构体中调用。
函数:
ParseOrNil()FromPartsOrNil()FromBytesOrNil()不使用 OrNil 函数的示例:
func getPosts(before, after []byte) { b, err := ksuid.FromBytes(before) if err != nil { // 处理错误 } a, err := ksuid.FromBytes(after) if err != nil { // 处理错误 } sortOptions := SortOptions{Before: b, After: a} }
使用 OrNil 函数更方便:
func getPosts(before, after []byte) { sortOptions := SortOptions{ Before: ksuid.FromBytesOrNil(before), After: ksuid.FromBytesOrNil(after), } }
OrNil 函数在许多其他库中也有使用:
ksuid源代码采用MIT许可证。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据 透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境 (IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号