Rust 定义新的 Uuid 命名空间

Rust define new Uuid namespace

我正在使用 rust uuid crate:https://crates.io/crates/uuid

我需要为我的程序使用自定义名称空间生成的“v5”ID。定义自定义命名空间的正确方法是什么?我查看了如何定义 NAMESPACE_OID 的源代码:

pub const NAMESPACE_DNS: Self = Uuid([
        0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1, 0x80, 0xb4, 0x00, 0xc0,
        0x4f, 0xd4, 0x30, 0xc8,
    ]);

但是,复制代码并将其放入我的模块(当然更改名称和字节)是行不通的。 (我已经预先计算了我的命名空间 Uuid 所需的字节数)

pub const NAMESPACE_MYOWN: Uuid = Uuid([...]);

然后我希望通过以下方式生成一个新的 Uuid:Uuid::new_v5(&NAMESPACE_MYOWN, "my string".as_bytes())

但错误发生在编译时常量 NAMESPACE_MYOWN 初始化时,错误为:cannot initialize a tuple struct which contains private fields constructor is not visible here due to private fields

我相信 rust crate 已经使这个使用字节的构造函数成为私有的?

当然,一个可能的解决方案是使用类似的方法:Uuid::parse_string 每次我需要命名空间 Uuid 时,都将字符串硬编码到某处。但是每次固定的时候都要计算命名空间的Uuid,好像有点浪费?

parse_string也会出错,这意味着我需要处理错误等。当我可以事先保证我的命名空间 Uuid 是正确的时,会有很多开销。

有没有更好的方法?

您可以使用 Uuid::from_bytes:

pub const NAMESPACE_DNS: Uuid = Uuid::from_bytes([
    0x6b, 0xa7, 0xb8, 0x10, 
    0x9d, 0xad, 0x11, 0xd1, 
    0x80, 0xb4, 0x00, 0xc0,
    0x4f, 0xd4, 0x30, 0xc8,
]);