UUID标准有很多,你这个是哪一个标准?
- v1 - 使用当前时间和本地机器上的网络接口的MAC地址(或节点)生成。
- ~~v2~~ - 在v1的基础上,将时间字段低位替换为本地账户的ID,使得在时间地点创作者三个参数上尽可能让其唯一。
- v3 - 基于命名空间的MD5哈希生成。
- v4 - 使用随机数据生成。
- v5 - 基于命名空间的SHA1哈希生成。(注意:这通常是版本3的替代方案,SHA1比MD5更安全)
- v6 - 在v1的基础上,通过时间实现单调递增的生成(注意:这通常是版本1的替代方案,解决了v1的值分散和无法顺序插入的缺点)。
- v7 - 使用Unix Epoch毫秒时间戳并结合版本4的填充随机数据的方式生成(注意:这通常是版本6的替代版本,并且兼容ULID)。
- v8 - 使用用户定义的数据生成(version=48-51bit,variant=64-65bit,`UUID: ffeeddcc-bbaa-8988-b766-554433221100`)。
[C] 纯文本查看 复制代码 use ulid::Ulid;
use base32::Alphabet;
use uuid::{NoContext, Timestamp, Uuid};
fn main() {
let v7 = Uuid::new_v7(Timestamp::now(NoContext));
// 第一步:获取UUIDv7的二进制表示
let bytes = v7.as_bytes();
// 第二步:创建一个长度为20字节的字节数组v,并全部初始化为0
let mut v = Vec::from([0u8; 20]);
// 第三步:将UUIDv7的16字节二进制数据填充到v的末尾(从第5个字节开始,因为ULID通常包含一个4字节的时间戳前缀)
v[4..].clone_from_slice(bytes);
// 第四步:将填充后的20字节数据v转换为Crockford版本的base32编码(不含 ILOU 四个字符)
let base32 = base32::encode(Alphabet::Crockford, v.as_slice());
// 第五步:由于ULID通常包含一个时间戳前缀的编码,我们截取base32编码字符串的剩余部分(跳过前6个字符)
let ulid = &base32[6..];
println!("{}", ulid);
let u = v7.as_u128();
let ulid = Ulid::from(u);
println!("{}", ulid.to_string());
} |