【问题标题】:How to hash output of sha256 with sha256 in rust如何在 rust 中使用 sha256 对 sha256 的输出进行哈希处理
【发布时间】:2014-10-06 16:30:10
【问题描述】:

我写了一些生锈的代码,它有一个终身问题。

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.

我怎样才能改变它,并且仍然让它有效地执行?

【问题讨论】:

标签: rust sha256 lifetime


【解决方案1】:

这是因为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());
}

希望对您有所帮助。

【讨论】:

  • 谢谢,这真的很有趣。我刚开始生锈。似乎在 rust 中,从链式表达式中分离变量对生命周期很重要,而不仅仅是清晰度?
  • 注意:我的代码在let bytes... 之后也缺少sha256.reset();,但这是一个不相关的问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2011-06-08
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2020-02-06
相关资源
最近更新 更多