Rust全局唯一标识符库uguid的使用:轻量级UUID生成与解析工具

uguid

no_std 库提供 GUID(全局唯一标识符)类型,用于 GPT 磁盘、UEFI 和 Microsoft Windows。

功能

默认情况下未启用任何功能。

  • bytemuck: 为 Guid 实现 bytemuck 的 PodZeroable 特征。
  • serde: 为 Guid 实现 serde 的 SerializeDeserialize 特征。
  • 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)
        }
    }
}
回到顶部