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



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

use sha2::{Digest, Sha256}; // 0.8.2
fn main() {
let preimage = [42; 80];
let hash = Sha256::digest(&Sha256::digest(&preimage));
}

这不会:

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);
}
}

我收到一个错误:

error[E0308]: mismatched types
--> src/main.rs:7:16
|
7 |         hash = Sha256::digest(&hash);
|                ^^^^^^^^^^^^^^^^^^^^^ expected array `[u8; 80]`, found struct `generic_array::GenericArray`
|
= note: expected array `[u8; 80]`
found struct `generic_array::GenericArray<u8, typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>>`

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

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

您的第一次尝试可能是将所有内容都设为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);
}
}

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

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

use sha2::{Digest, Sha256}; // 0.8.2
fn main() {
let input = [42u8; 80];
let mut intermediate;
let mut hash = &input[..];

for _ in 0..2 {
intermediate = Sha256::digest(&hash);
hash = &intermediate[..];
}
}

input是一个包含 80 个元素的数组,intermediate是一个GenericArray<u8, 32>hash是一个&[u8]inputintermediate都可以被视为一个切片,因此hash算作两者之间的常见类型。

另请参阅:

  • 是否允许多态变量?
  • 创建具有动态数量的 .and(( 的 Diesel.rs 查询

可能最简单的解决方案是将第一次迭代拉出循环:

let preimage = [42; 80];
let mut hash = Sha256::digest(&preimage);
for _ in 1..2 {
hash = Sha256::digest(&hash);
}

(游乐场(

这使得hash从一开始就成为GenericArray,因此循环工作正常。

最新更新