gpt4 book ai didi

performance - rust 去污牛哈希集

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

想要存储大量的字节数组,并希望使用AHashMap<Vec<u8>>进行此操作,并使用Cow借用它,并且仅在需要时才进行写入,因此这也将导致其重复数据删除。但是到目前为止,我的尝试是徒劳的:

#![feature(hash_set_entry)]

use std::borrow::{Borrow, Cow, ToOwned};
use std::hash::Hash;

use ahash::AHashSet;

#[derive(Debug)]
struct CipherText<'a> {
ciphertext: Cow<'a, Vec<u8>>,
ciphers: Vec<Cipher<'a>>,
}

#[derive(Debug)]
struct Cipher<'a> {
cipher_id: Cow<'a, Vec<u8>>,
keys: Vec<Cow<'a, Vec<u8>>>,
}

fn main() {
let mut string_table: AHashSet<Vec<u8>> = vec![
"Hello World!".as_bytes().to_vec(),
"atbash".as_bytes().to_vec(),
"caesar_decrypt".as_bytes().to_vec(),
"5".as_bytes().to_vec(),
]
.into_iter()
.collect();

let mut ciphertexts: Vec<CipherText> = vec![
CipherText {
ciphertext: Cow::Borrowed(
string_table
.get(&"Hello World!".as_bytes().to_vec())
.unwrap(),
),
ciphers: vec![Cipher {
cipher_id: Cow::Borrowed(string_table.get(&"atbash".as_bytes().to_vec()).unwrap()),
keys: vec![],
}],
},
CipherText {
ciphertext: Cow::Borrowed(
string_table
.get(&"Hello World!".as_bytes().to_vec())
.unwrap(),
),
ciphers: vec![Cipher {
cipher_id: Cow::Borrowed(
string_table
.get(&"caesar_decrypt".as_bytes().to_vec())
.unwrap(),
),
keys: vec![Cow::Borrowed(
string_table.get(&"5".as_bytes().to_vec()).unwrap(),
)],
}],
},
];

string_table.insert("TEST".as_bytes().to_vec());
string_table.insert("TEST2".as_bytes().to_vec());

ciphertexts[0].ciphertext = Cow::Borrowed(
&string_table.get_or_insert_owned(&"Goodbye Cruel World...".as_bytes().to_vec()),
);
}

TEST行和ciphertext [0]行错误均如下所示
error[E0502]: cannot borrow `string_table` as mutable because it is also borrowed as immutable
--> src/main.rs:61:5
|
33 | string_table
| ------------ immutable borrow occurs here
...
61 | string_table.insert("TEST".as_bytes().to_vec());
| ^^^^^^^^^^^^ mutable borrow occurs here
...
64 | ciphertexts[0].ciphertext = Cow::Borrowed(
| ----------- immutable borrow later used here
我的目标是所有字节数组仅作为引用,然后克隆,添加到string_table并引用,如果我更改它的话。这些数据将以自定义二进制格式存储,这是编写串行器和解串器的过程的开始。希望这一切都有道理!

最佳答案

string_table保留对CipherText的引用时,您无法对其进行突变。这只是Rust的核心不变式之一。因此,您不能使用Cow。解决它的典型方法通常是:

  • 使用索引/键来引用其他结构,不幸的是,在这种情况下,我看不到这样做的好方法。
  • 使用 Rc ,以便密文和表共享字节的所有权。这的确意味着密文可以独立存在,但是在明智地使用get_or_insert之前,您始终可以将表用作代理来简化元素。
    #![feature(hash_set_entry)]

    use std::rc::Rc;
    use ahash::AHashSet;

    #[derive(Debug)]
    struct CipherText {
    ciphertext: Rc<Vec<u8>>,
    ciphers: Vec<Cipher>,
    }

    #[derive(Debug)]
    struct Cipher {
    cipher_id: Rc<Vec<u8>>,
    keys: Vec<Rc<Vec<u8>>>,
    }

    fn main() {
    let mut string_table: AHashSet<Rc<Vec<u8>>> = vec![
    Rc::new("Hello World!".as_bytes().to_vec()),
    Rc::new("atbash".as_bytes().to_vec()),
    Rc::new("caesar_decrypt".as_bytes().to_vec()),
    Rc::new("5".as_bytes().to_vec()),
    ]
    .into_iter()
    .collect();

    let mut ciphertexts: Vec<CipherText> = vec![
    CipherText {
    ciphertext: string_table
    .get_or_insert(Rc::new("Hello World!".as_bytes().to_vec()))
    .clone(),
    ciphers: vec![Cipher {
    cipher_id: string_table
    .get_or_insert(Rc::new("atbash".as_bytes().to_vec()))
    .clone(),
    keys: vec![],
    }],
    },
    CipherText {
    ciphertext: string_table
    .get_or_insert(Rc::new("Hello World!".as_bytes().to_vec()))
    .clone(),
    ciphers: vec![Cipher {
    cipher_id: string_table
    .get_or_insert(Rc::new("caesar_decrypt".as_bytes().to_vec()))
    .clone(),
    keys: vec![string_table
    .get_or_insert(Rc::new("5".as_bytes().to_vec()))
    .clone()],
    }],
    },
    ];

    string_table.insert(Rc::new("TEST".as_bytes().to_vec()));
    string_table.insert(Rc::new("TEST2".as_bytes().to_vec()));

    ciphertexts[0].ciphertext = string_table
    .get_or_insert(Rc::new("Goodbye Cruel World...".as_bytes().to_vec()))
    .clone();
    }
    这将与Cow具有相同的效果,Rc拥有的元素是不可变的,因此必须进行新的元素进行更改。
  • 关于performance - rust 去污牛哈希集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66443397/

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