Vector 展平地图<;Vec<;u8>;,Vec<;u8>&燃气轮机;变成一个Vec<;u8>;然后将其返回到地图<;Vec<;u8>;,Vec<;u8>&燃气轮机;

Vector 展平地图<;Vec<;u8>;,Vec<;u8>&燃气轮机;变成一个Vec<;u8>;然后将其返回到地图<;Vec<;u8>;,Vec<;u8>&燃气轮机;,vector,rust,hashmap,bytebuffer,Vector,Rust,Hashmap,Bytebuffer,我有一个HashMap中的数据,我想将该数据作为字节缓冲区(单个Vec)写入一个文件,然后从文件中读回数据并重建HashMap结构 有没有一个既定的算法来展平和恢复这样的地图?我可以将元数据写入文件以区分数据分区等的位置。由于此项目的性质,我无法使用结构化序列化-我正在加密数据和文件。您可以使用以下格式存储此数据: value1_len | value1_bytes | key1_len | key1_len | key1_bytes | value2_len | value2_bytes |

我有一个
HashMap
中的数据,我想将该数据作为字节缓冲区(单个
Vec
)写入一个文件,然后从文件中读回数据并重建
HashMap
结构


有没有一个既定的算法来展平和恢复这样的地图?我可以将元数据写入文件以区分数据分区等的位置。由于此项目的性质,我无法使用结构化序列化-我正在加密数据和文件。

您可以使用以下格式存储此数据:

value1_len | value1_bytes | key1_len | key1_len | key1_bytes | value2_len | value2_bytes | |

使用标准库()可以很容易地完成什么:

使用std::collections::HashMap;
使用std::convert::TryInto;
fn序列化(映射:&HashMap)->Vec{
iter()折叠(Vec::new(),| mut acc,(k,v)|{
acc.extend(&k.len())到_le_bytes());
acc.extend(k.as_slice());
acc.extend(&v.len())到_le_bytes());
附件扩展(v.as_slice());
行政协调会
})
}
fn read_vec(输入:&mut&[u8])->vec{
let(len,rest)=input.split_在(std::mem::size_of::())处;
让len=usize::from_le_字节(len.try_into().unwrap());
let(v,rest)=rest.split_at(len);
*输入=休息;
v、 to_vec()
}
fn反序列化(字节:&Vec)->HashMap{
让mut map=HashMap::new();
让mut left=&字节[…];
而左。len()>0{
设k=read_vec(&mut left);
设v=读取向量(&mut left);
地图。插入(k,v);
}
地图
}
fn main(){
让mut map=HashMap::new();
map.insert(vec![1,2,3],vec![4,5,6]);
map.insert(vec![4,5,6],vec![1,2,3]);
map.insert(vec![1,5,3],vec![4,2,6]);
让数组=序列化(&map);
让恢复的\u map=反序列化(&array);
断言(映射,恢复的映射);
}

您可以使用以下格式存储:

value1_len | value1_bytes | key1_len | key1_len | key1_bytes | value2_len | value2_bytes | |

使用标准库()可以很容易地完成什么:

使用std::collections::HashMap;
使用std::convert::TryInto;
fn序列化(映射:&HashMap)->Vec{
iter()折叠(Vec::new(),| mut acc,(k,v)|{
acc.extend(&k.len())到_le_bytes());
acc.extend(k.as_slice());
acc.extend(&v.len())到_le_bytes());
附件扩展(v.as_slice());
行政协调会
})
}
fn read_vec(输入:&mut&[u8])->vec{
let(len,rest)=input.split_在(std::mem::size_of::())处;
让len=usize::from_le_字节(len.try_into().unwrap());
let(v,rest)=rest.split_at(len);
*输入=休息;
v、 to_vec()
}
fn反序列化(字节:&Vec)->HashMap{
让mut map=HashMap::new();
让mut left=&字节[…];
而左。len()>0{
设k=read_vec(&mut left);
设v=读取向量(&mut left);
地图。插入(k,v);
}
地图
}
fn main(){
让mut map=HashMap::new();
map.insert(vec![1,2,3],vec![4,5,6]);
map.insert(vec![4,5,6],vec![1,2,3]);
map.insert(vec![1,5,3],vec![4,2,6]);
让数组=序列化(&map);
让恢复的\u map=反序列化(&array);
断言(映射,恢复的映射);
}

简单地写
(V,V)
有什么问题吗
V
是成对的
(len,bytes)
?考虑过这样做,但不太热衷于使用元组来解决这个问题。如果我说take hashmap并将键和值过滤到一个
Vec
中,其中第一个值是len,第二个是字节列表,那么仍然很难知道哪个项是键,哪个是值。你可以将它的值存储在它的键之后,让我显示它的正确性,可以说,将哈希映射展平到文件就是序列化,无论格式如何。因此,您可能需要澄清哪些可以使用,哪些不能使用。例如,使用serde,您可以将数据序列化为JSON,然后对生成的字符串进行加密并将其写入文件。简单地编写
(V,V)
是否有任何问题,其中
V
是pair
(len,bytes)
?考虑过这样做,但不太热衷于使用元组来解决这个问题。如果我说take hashmap并将键和值过滤到一个
Vec
中,其中第一个值是len,第二个是字节列表,那么仍然很难知道哪个项是键,哪个是值。你可以将它的值存储在它的键之后,让我显示它的正确性,可以说,将哈希映射展平到文件就是序列化,无论格式如何。因此,您可能需要澄清哪些可以使用,哪些不能使用。例如,使用serde,您可以将数据序列化为JSON,然后对生成的字符串进行加密并将其写入文件。我可能仍然使用它的一个变体,只是将其作为可选API添加。我最终使用了bincode,但我喜欢您的解决方案。我仍然可以使用它的一个变体,并将其作为可选API添加。