gpt4 book ai didi

rust - 防 rust 反序列化: converting vector of bytes to hashset of uuid

转载 作者:行者123 更新时间:2023-12-03 11:42:29 26 4
gpt4 key购买 nike

我的目标是
序列化(HashSet<Uuid>-> Vec<u8>)
并反序列化(&[u8]-> HashSet<Uuid>)
uuid的哈希集。
我有以下序列化:

fn serialize(set: HashSet<Uuid>) -> Vec<u8>{
set.into_iter().map(|x| x.as_bytes()).collect()
}
当我知道确切的uuid数量时,我在反序列化方面的尝试最终就变成了这样的事情:
fn clone_into_array<A, T>(slice: &[T]) -> A
where A: Sized + Default + std::convert::AsMut<[T]>,
T: Clone
{
let mut a = Default::default();
<A as std::convert::AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
a
}
fn deserialize(data: &[u8]){
let first_uuid = Uuid::from_bytes(clone_into_array(&data[0..16]))
...

}
问题:
我的序列化甚至正确吗?
如果我不知道确切的设置大小,如果知道以前使用 &[u8]函数进行了序列化,该如何从 HashSet<Uuid>反序列化回 serialize
我的反序列化方法是否正确,或者还有其他更清洁的方法?

最佳答案

您的序列化不正确,因为它尝试从Vec<u8>收集Iterator<Item = &[u8; 16]>。相反,您可以折叠迭代器,并在切片上扩展Vec。对于反序列化,您知道每个Uuid都会占用16个字节,因此您应该使用chunks_exact对其进行迭代并收集为哈希集:

fn serialize(set: HashSet<Uuid>) -> Vec<u8>{
set.into_iter().fold(Vec::new(), |mut acc, v| {
acc.extend_from_slice(v.as_bytes());
acc
})
}

fn deserialize(bytes: &[u8]) -> HashSet<Uuid> {
bytes.chunks_exact(16).map(Uuid::from_slice).collect::<Result<_, _>>().unwrap()
}
Playground link

关于rust - 防 rust 反序列化: converting vector of bytes to hashset of uuid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65268226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com