Rust全局唯一标识符库uguid的使用:轻量级UUID生成与解析工具
uguid
no_std
库提供 GUID(全局唯一标识符)类型,用于 GPT 磁盘、UEFI 和 Microsoft Windows。
功能
默认情况下未启用任何功能。
bytemuck
: 为Guid
实现 bytemuck 的Pod
和Zeroable
特征。serde
: 为Guid
实现 serde 的Serialize
和Deserialize
特征。std
: 目前没有效果。
最低支持的 Rust 版本 (MSRV)
当前 MSRV 是 1.81。
许可证
根据您的选择,可以按照 Apache License, Version 2.0 或 MIT license 进行许可。
免责声明
此项目不是官方的 Google 项目。它不受 Google 支持,并且 Google 明确否认对其质量、适销性或特定用途适用性的所有保证。
安装
在您的项目目录中运行以下 Cargo 命令:
cargo add uguid
或者将以下行添加到您的 Cargo.toml:
uguid = "2.2.1"
完整示例代码
// 引入 uguid 库
use uguid::Guid;
fn main() {
// 创建一个新的 GUID
let guid = Guid::new();
println!("Generated GUID: {}", guid);
// 从字符串解析 GUID
let guid_str = "12345678-1234-5678-9abc-def012345678";
let parsed_guid = Guid::parse(guid_str).expect("Invalid GUID format");
println!("Parsed GUID: {}", parsed_guid);
// 检查 GUID 是否为空
let empty_guid = Guid::nil();
println!("Is empty GUID nil? {}", empty_guid.is_nil());
// 比较两个 GUID
let guid1 = Guid::new();
let guid2 = Guid::new();
println!("Are GUIDs equal? {}", guid1 == guid2);
}
// 使用 serde 功能时的示例
#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};
#[cfg(feature = "serde")]
#[derive(Serialize, Deserialize)]
struct MyStruct {
id: Guid,
name: String,
}
#[cfg(feature = "serde")]
fn serde_example() {
let my_data = MyStruct {
id: Guid::new(),
name: "Example".to_string(),
};
// 序列化为 JSON
let json = serde_json::to_string(&my_data).unwrap();
println!("Serialized: {}", json);
// 从 JSON 反序列化
let deserialized: MyStruct = serde_json::from_str(&json).unwrap();
println!("Deserialized ID: {}", deserialized.id);
}
// 使用 bytemuck 功能时的示例
#[cfg(feature = "bytemuck")]
use bytemuck::{Pod, Zeroable};
#[cfg(feature = "bytemuck")]
fn bytemuck_example() {
// 创建 GUID 的零值实例
let zero_guid: Guid = Zeroable::zeroed();
println!("Zero GUID: {}", zero_guid);
// 将 GUID 转换为字节数组
let guid = Guid::new();
let bytes: &[u8] = bytemuck::bytes_of(&guid);
println!("GUID bytes: {:?}", bytes);
// 从字节数组创建 GUID
let from_bytes: &Guid = bytemuck::from_bytes(bytes);
println!("GUID from bytes: {}", from_bytes);
}
完整示例demo
// 完整示例:展示 uguid 库的基本使用和功能
use uguid::Guid;
fn main() {
// 基本 GUID 操作示例
println!("=== 基本 GUID 操作 ===");
// 创建新的 GUID
let guid1 = Guid::new();
println!("新生成的 GUID: {}", guid1);
// 从字符串解析 GUID
let guid_str = "c9a646d3-9c61-4cb7-bfcd-ee2522c8f633";
match Guid::parse(guid_str) {
Ok(guid) => println!("解析的 GUID: {}", guid),
Err(e) => println!("解析失败: {}", e),
}
// 创建空 GUID
let nil_guid = Guid::nil();
println!("空 GUID: {}", nil_guid);
println!("是否为空: {}", nil_guid.is_nil());
// GUID 比较
let guid2 = Guid::new();
println!("GUID 比较: {}", guid1 == guid2);
// 启用不同功能时的示例
#[cfg(feature = "serde")]
serde_example();
#[cfg(feature = "bytemuck")]
bytemuck_example();
}
// Serde 功能示例
#[cfg(feature = "serde")]
fn serde_example() {
use serde::{Serialize, Deserialize};
println!("\n=== Serde 功能示例 ===");
#[derive(Serialize, Deserialize)]
struct User {
id: Guid,
username: String,
}
let user = User {
id: Guid::new(),
username: "john_doe".to_string(),
};
// 序列化到 JSON
let json = serde_json::to_string(&user).unwrap();
println!("序列化后的 JSON: {}", json);
// 从 JSON 反序列化
let deserialized: User = serde_json::from_str(&json).unwrap();
println!("反序列化的用户 ID: {}", deserialized.id);
}
// Bytemuck 功能示例
#[cfg(feature = "bytemuck")]
fn bytemuck_example() {
use bytemuck::{Zeroable, bytes_of};
println!("\n=== Bytemuck 功能示例 ===");
// 创建零值 GUID
let zero_guid: Guid = Zeroable::zeroed();
println!("零值 GUID: {}", zero_guid);
// GUID 与字节数组转换
let guid = Guid::new();
let bytes = bytes_of(&guid);
println!("GUID 字节表示: {:?}", bytes);
// 注意:实际使用时需要确保字节数组格式正确
println!("原始 GUID: {}", guid);
}
1 回复
uguid:轻量级UUID生成与解析工具
介绍
uguid是一个专为Rust设计的轻量级全局唯一标识符库,提供简单高效的UUID生成和解析功能。该库支持标准UUID格式(v4随机生成),无需复杂依赖,适合需要轻量级唯一标识符生成的场景。
使用方法
添加依赖
在Cargo.toml中添加:
[dependencies]
uguid = "0.1"
基本用法
生成UUID
use uguid::Uuid;
fn main() {
// 生成随机UUID
let uuid = Uuid::new_v4();
println!("生成的UUID: {}", uuid);
// 输出示例:生成的UUID: 67e55044-10b1-426f-9247-bb680e5fe0c8
}
解析字符串为UUID
use uguid::Uuid;
fn main() {
// 从字符串解析UUID
let uuid_str = "550e8400-e29b-41d4-a716-446655440000";
let uuid = Uuid::parse_str(uuid_str).expect("无效的UUID格式");
println!("解析后的UUID: {}", uuid);
println!("字节表示: {:?}", uuid.as_bytes());
}
从字节数组创建UUID
use uguid::Uuid;
fn main() {
// 从16字节数组创建UUID
let bytes: [u8; 16] = [
0x12, 0x3e, 0x45, 0x67,
0xe8, 0x9b, 0x12, 0xd3,
0xa4, 0x56, 0x42, 0x66,
0x55, 0x44, 0x00, 0x00
];
let uuid = Uuid::from_bytes(bytes);
println!("从字节创建的UUID: {}", uuid);
}
比较UUID
use uguid::Uuid;
fn main() {
let uuid1 = Uuid::new_v4();
let uuid2 = Uuid::new_v4();
if uuid1 == uuid2 {
println!("UUID相同");
} else {
println!("UUID不同");
}
}
获取UUID的不同格式
use uguid::Uuid;
fn main() {
let uuid = Uuid::new_v4();
println!("标准格式: {}", uuid);
println!("简单格式: {}", uuid.simple());
println!("大写格式: {}", uuid.to_uppercase());
println!("URN格式: {}", uuid.to_urn());
}
特性
- 轻量级:无额外依赖
- 符合标准:支持RFC 4122 UUID v4
- 零成本抽象:高性能实现
- 安全:所有操作都是内存安全的
错误处理
use uguid::{Uuid, ParseError};
fn parse_uuid(input: &str) -> Result<Uuid, ParseError> {
match Uuid::parse_str(input) {
Ok(uuid) => Ok(uuid),
Err(e) => {
eprintln!("解析失败: {}", e);
Err(e)
}
}
}
这个库非常适合需要简单UUID功能的项目,避免了大型UUID库的复杂性。
完整示例demo
use uguid::{Uuid, ParseError};
fn main() {
// 示例1:生成随机UUID
println!("=== 生成随机UUID ===");
let uuid1 = Uuid::new_v4();
println!("生成的UUID: {}", uuid1);
// 示例2:解析字符串为UUID
println!("\n=== 解析字符串为UUID ===");
let uuid_str = "550e8400-e29b-41d4-a716-446655440000";
match Uuid::parse_str(uuid_str) {
Ok(uuid) => {
println!("解析成功: {}", uuid);
println!("字节表示: {:?}", uuid.as_bytes());
}
Err(e) => eprintln!("解析失败: {}", e),
}
// 示例3:从字节数组创建UUID
println!("\n=== 从字节数组创建UUID ===");
let bytes: [u8; 16] = [
0x12, 0x3e, 0x45, 0x67,
0xe8, 0x9b, 0x12, 0xd3,
0xa4, 0x56, 0x42, 0x66,
0x55, 0x44, 0x00, 0x00
];
let uuid_from_bytes = Uuid::from_bytes(bytes);
println!("从字节创建的UUID: {}", uuid_from_bytes);
// 示例4:比较UUID
println!("\n=== 比较UUID ===");
let uuid2 = Uuid::new_v4();
let uuid3 = Uuid::new_v4();
if uuid2 == uuid3 {
println!("UUID相同");
} else {
println!("UUID不同");
}
// 示例5:获取UUID的不同格式
println!("\n=== 获取UUID的不同格式 ===");
let uuid4 = Uuid::new_v4();
println!("标准格式: {}", uuid4);
println!("简单格式: {}", uuid4.simple());
println!("大写格式: {}", uuid4.to_uppercase());
println!("URN格式: {}", uuid4.to_urn());
// 示例6:错误处理
println!("\n=== 错误处理示例 ===");
let invalid_uuid_str = "invalid-uuid-string";
match parse_uuid(invalid_uuid_str) {
Ok(uuid) => println!("解析成功: {}", uuid),
Err(_) => println!("解析失败,输入格式无效"),
}
}
// 错误处理函数
fn parse_uuid(input: &str) -> Result<Uuid, ParseError> {
match Uuid::parse_str(input) {
Ok(uuid) => Ok(uuid),
Err(e) => {
eprintln!("解析失败: {}", e);
Err(e)
}
}
}