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
类型实现了许多标准库接口,包括:
Stringer
database/sql.Scanner
和 database/sql/driver.Valuer
encoding.BinaryMarshal
和 encoding.BinaryUnmarshal
encoding.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许可证。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高 效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能 ,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
用于可扩展和多功能 3D 生成的结构化 3D 潜在表示
TRELLIS 是一个专注于 3D 生成的项目,它利用结构化 3D 潜在表示技术,实现了可扩展且多功能的 3D 生成。项目提供了多种 3D 生成的方法和工具,包括文本到 3D、图像到 3D 等,并且支持多种输出格式,如 3D 高斯、辐射场和网格等。通过 TRELLIS,用户可以根据文本描述或图像输入快速生成高质量的 3D 资产,适用于游戏开发、动画制作、虚拟现实等多 个领域。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号