我正在尝试实现迭代 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)
我想要第二种风格,这样我就可以轻松地重复两次以上。
正如编译器告诉您的那样,类型必须匹配才能为变量分配新值。你不能存储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]。二者input并intermediate可以被看作是一个切片,所以hash计数为两者之间的常见类型。
也可以看看: