2014-10-06 150 views
3

我寫過一些生存期問題的防火牆代碼。如何在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

回答

5

這是因爲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