湿周计算器 - 计算各种渠道形状的湿周
计算各种渠道形状的湿周,包括梯形、矩形/正方形和圆形管道。对水利工程和流体力学应用至关重要。
ULID 生成器
生成的 ULID:
ULID 结构
时间戳 (10 个字符)
随机性 (16 个字符)
📚
文档
ULID 生成器
介绍
ULID(通用唯一字典序可排序标识符)是一种唯一标识符,它将时间戳与随机数据结合在一起,创建一个 26 个字符的字符串。ULID 旨在在保持高度唯一性和随机性的同时,能够字典序排序。
ULID 的结构
ULID 由两个主要部分组成:
- 时间戳(10 个字符):前 10 个字符表示自 Unix 纪元(1970-01-01)以来的毫秒数。
- 随机性(16 个字符):其余 16 个字符是使用加密安全的随机数据生成的。
生成的 26 个字符的字符串使用 Crockford 的 base32 字母表编码(0-9 和 A-Z,排除 I、L、O 和 U)。
公式
ULID 的生成遵循以下步骤:
- 生成 48 位时间戳(自 Unix 纪元以来的毫秒数)。
- 生成 80 位加密安全的随机数据。
- 使用 Crockford 的 base32 编码对组合的 128 位进行编码。
计算
ULID 生成器执行以下步骤:
- 获取当前的毫秒时间戳。
- 使用加密安全的随机数生成器生成 10 个随机字节(80 位)。
- 将时间戳和随机数据组合成一个 128 位整数。
- 使用 Crockford 的 base32 编码对 128 位整数进行编码。
用例
ULID 在各种场景中都很有用,包括:
- 数据库键:ULID 可用作数据库记录的唯一标识符,确保唯一性和可排序性。
- 分布式系统:在分布式环境中,可以在节点之间生成 ULID,而无需协调。
- 日志和追踪:ULID 可用于标记日志条目或追踪事件,提供可排序和唯一的标识符。
- URL 友好的 ID:ULID 是 URL 安全的,可以在 Web 应用程序中用作 URL 中的标识符。
替代方案
虽然 ULID 是多功能的,但还有其他唯一标识符系统可以考虑:
- UUID(通用唯一标识符):一种 128 位的标识符,不包括时间戳组件。
- KSUID(K-可排序唯一标识符):与 ULID 类似,但具有不同的时间戳编码。
- 雪花 ID:Twitter 的分布式唯一 ID 生成系统,包含时间戳和工作 ID。
历史
ULID 于 2016 年由 Alizain Feerasta 提出,作为 UUID 的替代方案。它们旨在解决 UUID 的一些局限性,特别是在可排序性和可读性方面。自推出以来,ULID 规范保持稳定,已在不同编程语言中提供了各种实现。
示例
以下是不同编程语言中生成 ULID 的代码示例:
1// JavaScript 实现
2function generateULID() {
3 const timestamp = Date.now().toString(36).padStart(10, '0');
4 const randomness = crypto.getRandomValues(new Uint8Array(16))
5 .reduce((acc, byte) => acc + byte.toString(36).padStart(2, '0'), '');
6 return (timestamp + randomness).toUpperCase();
7}
8
9console.log(generateULID());
10
1## Python 实现
2import time
3import secrets
4import base64
5
6def generate_ulid():
7 timestamp = int(time.time() * 1000).to_bytes(6, byteorder="big")
8 randomness = secrets.token_bytes(10)
9 return base64.b32encode(timestamp + randomness).decode("ascii").lower()
10
11print(generate_ulid())
12
1// Java 实现
2import java.security.SecureRandom;
3import java.time.Instant;
4
5public class ULIDGenerator {
6 private static final SecureRandom random = new SecureRandom();
7 private static final char[] ENCODING_CHARS = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray();
8
9 public static String generateULID() {
10 long timestamp = Instant.now().toEpochMilli();
11 byte[] randomness = new byte[10];
12 random.nextBytes(randomness);
13
14 StringBuilder result = new StringBuilder();
15 // 编码时间戳
16 for (int i = 9; i >= 0; i--) {
17 result.append(ENCODING_CHARS[(int) (timestamp % 32)]);
18 timestamp /= 32;
19 }
20 // 编码随机数
21 for (byte b : randomness) {
22 result.append(ENCODING_CHARS[b & 31]);
23 }
24 return result.toString();
25 }
26
27 public static void main(String[] args) {
28 System.out.println(generateULID());
29 }
30}
31
这些示例演示了如何在 JavaScript、Python 和 Java 中生成 ULID。您可以根据具体需要调整这些函数或将其集成到需要唯一标识符的更大系统中。
参考文献
- "ULID 规范。" GitHub, https://github.com/ulid/spec. 访问时间:2024 年 8 月 2 日。
- "Crockford 的 Base32 编码。" Base32 编码, http://www.crockford.com/base32.html. 访问时间:2024 年 8 月 2 日。
- "UUID 与 ULID。" Stack Overflow, https://stackoverflow.com/questions/54222235/uuid-vs-ulid. 访问时间:2024 年 8 月 2 日。
💬
反馈
💬
点击反馈提示开始给这个工具反馈
🔗
相关工具
发现更多可能对您的工作流程有用的工具