如何在 Rust 中使用 UUID?
Rust 是一種提供高性能、安全性的現代編程語言。使 Rust 具有吸引力的特性之一是其豐富的 crate 生態系統,這些 crate 是可重用的庫,可以輕鬆集成到你的項目中。在本文中,我們將探索 Rust 中最流行的 crate 之一:uuid crate。
uuid crate 是一個 Rust 庫,用於生成和解析通用唯一標識符 (uuid)。UUID 是一個 128 位值,用作唯一標識符,通常用於數據庫、分佈式系統和網絡協議。這個 crate 非常受歡迎,在 GitHub 上有超過 846 顆星,被超過 17.4 萬個項目使用。
爲什麼要使用 uuid,有以下幾個原因:
-
它們是全局唯一的,這意味着兩個 uuid 相同的概率非常低。
-
它們很容易生成,不需要協調或中央權威。
-
它們是通用的,支持不同的版本和格式。
如何使用 uuid crate?
要使用 uuid crate,需要將其作爲項目的依賴項之一添加到 Cargo.toml 文件中:
[dependencies]
uuid = { version = "1.7", features = [ "serde", "v4"] }
features 選項可以啓用 crate 的不同功能,例如支持序列化 (serde) 和隨機生成 UUID(v4)。
一旦添加了依賴,就可以在 Rust 代碼中導入 crate:
use uuid::Uuid;
生成 UUID
uuid crate 支持通過單個 Cargo 特性生成 uuid 的所有標準化方法。默認情況下,crate 只能解析和格式化 uuid,但不能生成它們。根據你想要使用的 UUID 類型,需要在 Cargo.toml 文件中啓用相應的特性。
例如,如果你想生成隨機 uuid(版本 4),需要啓用 v4 特性:
[dependencies]
uuid = { version = "1.7", features = [ "v4"] }
然後,可以使用 new_v4 方法來創建一個隨機 UUID:
use uuid::Uuid;
fn main() {
let id = Uuid::new_v4();
println!("{}", id);
}
類似地,如果想基於某些數據的 SHA-1 哈希生成 uuid(版本 5),就需要啓用版本 5 的特性:
[dependencies]
uuid = { version = "1.7", features = [ "v5"] }
然後,可以使用 new_v5 方法來創建一個 hash 的 UUID:
use uuid::Uuid;
fn main() {
// DNS域的命名空間UUID
const NAMESPACE_DNS: Uuid = Uuid::from_u128(0x6ba7b810_9dad_11d1_80b4_00c04fd430c8);
// 要hash的數據
let name = "example.com";
// 創建版本5的UUID
let id = Uuid::new_v5(&NAMESPACE_DNS, name.as_bytes());
println!("{}", id);
}
該 crate 還支持其他版本的 uuid,
例如:
-
v1:基於時間戳和單調計數器
-
v3:基於某些數據的 MD5 哈希
-
v6:基於時間戳和具有不同佈局的單調計數器
-
v7:基於 Unix 時間戳
-
v8:基於用戶定義數據
解析 UUID
uuid crate 可以解析來自不同格式的 uuid,例如字符串、字節或片。可以使用 parse_str 方法從字符串中解析 UUID:
use uuid::{Uuid, Version};
fn main() {
// 一個有效的UUID字符串
let input = "67e55044-10b1-426f-9247-bb680e5fe0c8";
// 將字符串解析爲UUID
let id = Uuid::parse_str(input).unwrap();
println!("{}", id); // 67e55044-10b1-426f-9247-bb680e5fe0c8
// 獲取UUID的版本
assert_eq!(Some(Version::Random), id.get_version());
}
你也可以使用 from_bytes 或 from_slice 方法從字節數組或切片中解析 UUID:
use uuid::Uuid;
fn main() {
// 一個有效的UUID字節數組
let input = [
0x67, 0xe5, 0x50, 0x44, 0x10, 0xb1, 0x42, 0x6f,
0x92, 0x47, 0xbb, 0x68, 0x0e, 0x5f, 0xe0, 0xc8,
];
// 將字節解析爲UUID
let id = Uuid::from_bytes(input);
println!("{}", id); // 67e55044-10b1-426f-9247-bb680e5fe0c8
// 將字節片解析爲UUID
let id = Uuid::from_slice(&input[0..16]).unwrap();
println!("{}", id); // 67e55044-10b1-426f-9247-bb680e5fe0c8
}
格式化 UUID
uuid crate 可以以不同的方式格式化 uuid,例如十六進制字符串、urn 或簡單字符串。可以使用 hyphenated() 方法將 UUID 格式化爲帶連字符的十六進制字符串:
use uuid::Uuid;
fn main() {
// 隨機UUID
let id = Uuid::new_v4();
// 將UUID格式化爲帶連字符的字符串
let output = id.hyphenated().to_string();
println!("{}", output);
}
也可以使用 urn() 方法將 UUID 格式化爲統一資源名稱 (URN):
use uuid::Uuid;
fn main() {
// 隨機UUID
let id = Uuid::new_v4();
// 將UUID格式化爲URN
let output = id.urn().to_string();
println!("{}", output);
}
或者,可以使用 simple() 方法將 UUID 格式化爲不帶連字符 (-) 的簡單字符串:
use uuid::Uuid;
fn main() {
// 隨機UUID
let id = Uuid::new_v4();
// 將UUID格式化爲一個簡單的字符串
let output = id.simple().to_string();
println!("{}", output);
}
總結
uuid crate 是在 Rust 中使用 UUID 的一個強大而方便的工具。它支持 uuid 的所有標準版本和格式,並提供生成、解析和格式化 UUID 的簡單方法。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/EPbHjRoQ6yxwr0JcRYUsYg