Как хешировать вывод 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.

Как я могу изменить это и при этом позволить ему работать эффективно?


person fadedbee    schedule 06.10.2014    source источник
comment
где ты взял ша256? Я ищу хорошую реализацию   -  person Seph Reed    schedule 05.08.2017
comment
crates.io/crates/sha2   -  person fadedbee    schedule 18.12.2020


Ответы (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());
}

Надеюсь, это помогло.

person snf    schedule 06.10.2014
comment
Спасибо, это действительно интересно. Я только начинаю с ржавчины. Кажется, что в ржавчине выделение переменных из связанных выражений важно для жизни, а не только для ясности? - person fadedbee; 07.10.2014
comment
примечание: в моем коде также отсутствует sha256.reset(); после let bytes..., но это не связанная с этим проблема. - person fadedbee; 07.10.2014