gpt4 book ai didi

rust - 从Rust中的for循环返回值的最佳实践?

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

我是新手,刚读完紫色螃蟹书的第一章,就被困住了。
我正在使用此 crate 作为sha1 https://docs.rs/sha-1/0.9.1/sha1/
我想返回m.finalize()的输出;
我该如何实现防 rust ?
在Python中,我会做这样的事情

def gen_chain():
chain_redux = "some_Str"
hash = None
hasher = Sha1()
for i in range(0,iterations):
hasher.update(chain_redux)
hash = hasher.finalize()
hasher.reset()
chain_redux = redux(hash)
print(chain_redux)
return hash
这是我使用rust 的东西
fn calc_chain(name_table:&Vec<String> ,iterations:i32) -> GenericArray<u8, <sha1::Sha1 as Digest>::OutputSize>{

let mut m = sha1::Sha1::new();
let mut chain_redux = &name_table[0];
let mut hash;
// The above doesnt fly in rust. and i can't figure out how to make the arr! macro return a
// GenericArray<u8, <sha1::Sha1 as Digest>::OutputSize> I also don't know if I should.
for i in 0..iterations {
println!("Curr string: {}",chain_redux);
m.update(chain_redux);
hash = m.finalize(); // let hash = m.finalize() here keeps me from returning it because rust
// deletes it after the for loop scope
m.reset();
chain_redux = redux(&hash, name_table);
println!("Redux Output: {}",chain_redux);
};
hash

}
任何使用rust 的提示/指针在这里也将不胜感激。

最佳答案

Rustacean的原理之一是尽可能多地使用迭代器,因为它们通常比纯for循环要快,并且标准库具有很多精美的函数可以使用迭代器解决任何问题。
不幸的是,在这里,使用迭代器的方法并不理想。首先,因为它看起来并不花哨,所以我们必须使用丑陋的.last().unwrap()来获取最后的哈希值。其次,那里的map()迭代器有一些副作用(它会更改mchain_redux),这对于迭代器来说不是很惯用,但是惯用地做会为fold()迭代器增加几行

fn calc_chain(name_table: &Vec<String>, iterations:i32) -> GenericArray<u8, <sha1::Sha1 as Digest>::OutputSize> {
let mut m = sha1::Sha1::new();
let mut chain_redux = &name_table[0];
(0..iterations)
.map(|_| {
m.update(chain_redux);
let hash = m.finalize_reset()
chain_redux = redux(&hash, name_table);
hash
})
.last()
.unwrap()
}
如果您还不熟悉迭代器,则可以按以下方式阅读:
  • 0..iterations与您在for循环中使用的迭代器相同,如果您要求的话,它将为您提供从0, 1, 2, .. iterations-1的数字。
  • .map(|_| { ... })是一个迭代器,当您要求它提供值时,它将从先前的迭代器中获取一个值(即0..iterations中的数字),并根据给定的函数返回另一个值。在那里,对于每次迭代,将返回对应的哈希值
  • .last()是最终开始要求先前的迭代器提供值的函数,并且一旦先前的迭代器没有更多值可按需提供,它将返回最后一个值(即,最后一个哈希)
  • .unwrap()是必需的,因为.last()实际上返回了Option,但是我们认为至少有一个计算得出的哈希值,因此我们将其解包为
  • 关于rust - 从Rust中的for循环返回值的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64520832/

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