如何迭代调用 Sha256::digest,将前一个结果传递给每个后续调用?

Sno*_*att 3 rust

我正在尝试实现迭代 SHA256。这有效:

use sha2::{Digest, Sha256}; // 0.8.2

fn main() {
    let preimage = [42; 80];
    let hash = Sha256::digest(&Sha256::digest(&preimage));
}
Run Code Online (Sandbox Code Playgroud)

这不会:

use sha2::{Digest, Sha256}; // 0.8.2

fn main() {
    let preimage = [42; 80];
    let mut hash = preimage;
    for _ in 0..2 {
        hash = Sha256::digest(&hash);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

use sha2::{Digest, Sha256}; // 0.8.2

fn main() {
    let preimage = [42; 80];
    let hash = Sha256::digest(&Sha256::digest(&preimage));
}
Run Code Online (Sandbox Code Playgroud)

我想要第二种风格,这样我就可以轻松地重复两次以上。

She*_*ter 5

正如编译器告诉您的那样,类型必须匹配才能为变量分配新值。你不能存储bool在那里的i32应该是。数组和 aGenericArray是不同的类型。

您的第一次尝试可能是将所有内容都设置为GenericArray

use sha2::{Digest, Sha256}; // 0.8.2
use generic_array_0_12_3::GenericArray; // 0.12.3

fn main() {
    let mut hash = GenericArray::clone_from_slice(&[42u8; 80]);
    for _ in 0..2 {
        hash = Sha256::digest(&hash);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这会引起恐慌,因为您的输入数组有 80 个元素,而返回的数组GenericArray必须有 32 个元素——这是 SHA-256 摘要的长度!

相反,您需要引入一些中间步骤和一点间接性:

use sha2::{Digest, Sha256}; // 0.8.2
use generic_array_0_12_3::GenericArray; // 0.12.3

fn main() {
    let mut hash = GenericArray::clone_from_slice(&[42u8; 80]);
    for _ in 0..2 {
        hash = Sha256::digest(&hash);
    }
}
Run Code Online (Sandbox Code Playgroud)

input是一个有 80 个元素的数组,intermediate是 a GenericArray<u8, 32>hash是 a &[u8]。二者inputintermediate可以被看作是一个切片,所以hash计数为两者之间的常见类型。

也可以看看: