Whiz Tools

KSUID 生成器

KSUID 生成器

介绍

KSUID(K-可排序唯一标识符)是一种唯一标识符格式,相较于传统的 UUID(通用唯一标识符)和其他标识符系统,提供了多种优势。此工具允许您快速轻松地生成 KSUID。

什么是 KSUID?

KSUID 是一种 20 字节的可排序标识符,由以下部分组成:

  1. 32 位时间戳(4 字节)
  2. 16 字节的随机数

当以字符串形式表示时,KSUID 使用 base62 编码,长度为 27 个字符。

KSUID 的结构

KSUID 的结构可以分解如下:

  1. 时间戳(4 字节):表示自 Unix 纪元(1970 年 1 月 1 日 00:00 UTC)以来的秒数。时间戳允许 KSUID 按生成时间大致排序。

  2. 随机组件(16 字节):这是一个加密安全的随机数,确保即使在同一秒内生成多个 KSUID 也能保持唯一性。

  3. Base62 编码:将组合的 20 字节(时间戳 + 随机数)使用 base62(A-Z, a-z, 0-9)编码,生成最终的 27 字符串。

KSUID 公式

KSUID 可以用数学表示为:

KSUID=Base62(TR)KSUID = Base62(T || R)

其中:

  • TT 是 32 位时间戳
  • RR 是 128 位随机组件
  • || 表示连接

时间戳 TT 的计算为:

T = \text{floor}(\text{current_time} - \text{KSUID_epoch})

其中 KSUID_epoch 为 1400000000(2014-05-13T16:53:20Z)。

KSUID 结构图

时间戳(4 字节) 随机组件(16 字节)

KSUID 的使用场景

KSUID 在以下场景中特别有用:

  1. 分布式系统:当您需要在多个服务器或服务之间生成唯一标识符时,无需协调。

  2. 可按时间排序的数据:当您希望按创建时间排序数据而无需存储单独的时间戳时。

  3. 数据库键:作为数据库中的主键,特别是在不适合自增整数的分布式数据库中。

  4. URL 安全标识符:用于在 Web 应用程序中为资源创建简短、唯一、URL 安全的标识符。

  5. 日志关联:在微服务架构中关联不同服务的日志条目。

KSUID 的优势

KSUID 相较于其他标识符系统提供了多种优势:

  1. 可排序性:与 UUID 不同,KSUID 可以按时间顺序排序,这对数据库索引和日志分析非常有用。

  2. 无需协调:与自增 ID 不同,KSUID 可以由不同服务器独立生成,而不会导致冲突。

  3. 紧凑表示:KSUID 的字符串表示为 27 个字符,比 UUID 更紧凑。

  4. 嵌入时间戳:嵌入的时间戳允许基于时间的排序和过滤,而无需单独的时间戳字段。

  5. URL 安全:base62 编码使 KSUID 在 URL 中使用时无需额外编码。

  6. 减少冲突概率:16 字节的随机组件使得即使在高生成速率下,冲突也极不可能发生。

如何使用此生成器

  1. 输入任何额外参数(如自定义时间戳)。
  2. 点击“生成 KSUID”按钮以创建新的 KSUID。
  3. 生成的 KSUID 将显示在输出字段中。
  4. 您可以通过重复步骤 1-3 生成多个 KSUID。
  5. 使用每个 KSUID 旁边的“复制”按钮将其复制到剪贴板。
  6. 可选地,使用“导出”功能下载生成的 KSUID 列表。

请记住,每个 KSUID 都是唯一的,应该仅使用一次。每次需要唯一标识符时,请生成新的 KSUID。

代码示例

以下是在各种编程语言中生成 KSUID 的示例:

## Python
import ksuid

new_id = ksuid.ksuid()
print(f"生成的 KSUID: {new_id}")
// JavaScript
const { ksuid } = require('ksuid')

const newId = ksuid()
console.log(`生成的 KSUID: ${newId}`)
// Java
import com.github.ksuid.KsuidGenerator;

public class KsuidExample {
    public static void main(String[] args) {
        String newId = KsuidGenerator.generate();
        System.out.println("生成的 KSUID: " + newId);
    }
}
// C++
#include <iostream>
#include <ksuid/ksuid.hpp>

int main() {
    ksuid::Ksuid newId = ksuid::Ksuid::generate();
    std::cout << "生成的 KSUID: " << newId.string() << std::endl;
    return 0;
}
## Ruby
require 'ksuid'

new_id = KSUID.new
puts "生成的 KSUID: #{new_id}"
// PHP
<?php
require_once 'vendor/autoload.php';

use Tuupola\KsuidFactory;

$factory = new KsuidFactory();
$newId = $factory->create();
echo "生成的 KSUID: " . $newId . "\n";
?>
// Go
package main

import (
    "fmt"
    "github.com/segmentio/ksuid"
)

func main() {
    newId := ksuid.New()
    fmt.Printf("生成的 KSUID: %s\n", newId.String())
}
// Swift
import KSUID

let newId = KSUID()
print("生成的 KSUID: \(newId)")

参考资料

  1. Segment 的 KSUID GitHub 仓库: https://github.com/segmentio/ksuid
  2. Peter Bourgon 的“生成良好的唯一标识符”:https://peter.bourgon.org/blog/2019/05/20/generating-good-unique-ids.html
  3. KSUID 规范:https://github.com/segmentio/ksuid/blob/master/README.md
Feedback