如何在sha256中sha256与sha256的哈希输出

问题描述:

我写过一些生存期问题的防火墙代码。如何在sha256中sha256与sha256的哈希输出

let mut sha256 = Sha256::new(); 
sha256.input_str(input.as_slice()); 

for i in range(0i,16) { 
    println!("i == {}, hash == {}", i, sha256.result_str()); 
    let bytes = sha256.result_bytes().as_slice(); 
    sha256.input(bytes); 
} 

的错误是:

$ cargo build && ./target/hello_world asdfasdf 
    Compiling hello_world v0.1.0 (file:///home/chris/hello_world) 
src/hello_world.rs:41:21: 41:42 error: borrowed value does not live long enough 
src/hello_world.rs:41   let bytes = sha256.result_bytes().as_slice(); 
              ^~~~~~~~~~~~~~~~~~~~~ 
src/hello_world.rs:39:27: 43:6 note: reference must be valid for the block at 39:26... 
src/hello_world.rs:39  for i in range(0i,16) { 
src/hello_world.rs:40   println!("i == {}, hash == {}", i, sha256.result_str()); 
src/hello_world.rs:41   let bytes = sha256.result_bytes().as_slice(); 
src/hello_world.rs:42   sha256.input(bytes); 
src/hello_world.rs:43  } 
src/hello_world.rs:41:9: 41:53 note: ...but borrowed value is only valid for the statement at 41:8; consider using a `let` binding to increase its lifetime 
src/hello_world.rs:41   let bytes = sha256.result_bytes().as_slice(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 
Could not compile `hello_world`. 

To learn more, run the command again with --verbose. 

如何我可以改变这一点,还是让它有效地执行?

+0

你从哪里得到sha256?我正在寻找一个很好的实现 – 2017-08-05 06:30:30

这是因为result_bytes()的结果在该行后被丢弃,并且as_slice()正在获取对它的引用。借阅检查员不会让它发生。

对于它的工作,你应该写它想:

let mut sha256 = Sha256::new(); 
sha256.input_str(input.as_slice()); 

for i in range(0i,16) { 
    println!("i == {}, hash == {}", i, sha256.result_str()); 
    let bytes = sha256.result_bytes(); 
    sha256.reset(); 
    sha256.input(bytes.as_slice()); 
} 

希望它帮助。

+0

谢谢,这真的很有趣。我只是开始生锈。看起来在锈蚀中,从链式表达中突破变量对于生命期而言非常重要,而不仅仅是清晰度? – fadedbee 2014-10-07 09:32:28

+0

注意:我的代码在'let bytes ...'后面也没有找到'sha256.reset();',但这是一个无关紧要的问题。 – fadedbee 2014-10-07 09:42:49