【问题标题】:How to return a result from the Blake2 crate in Rust?如何从 Rust 中的 Blake2 crate 返回结果?
【发布时间】:2019-08-23 18:48:27
【问题描述】:

我正在努力使用blake2 crate 获取传递的文件名的哈希值。来自文档:

extern crate blake2;

use blake2::{Blake2b, Digest};
use std::env;
use std::fs;
use std::io::{self, Read};

const BUFFER_SIZE: usize = 1024;

fn print_result(sum: &[u8]) {
    for byte in sum {
        print!("{:02x}", byte);
    }
}

fn process<D: Digest + Default, R: Read>(reader: &mut R) {
    let mut sh = D::default();
    let mut buffer = [0u8; BUFFER_SIZE];
    loop {
        let n = match reader.read(&mut buffer) {
            Ok(n) => n,
            Err(_) => return,
        };
        sh.input(&buffer[..n]);
        if n == 0 || n < BUFFER_SIZE {
            break;
        }
    }
    print_result(&sh.result());
}

fn main() {
    let args = env::args();
    if args.len() > 1 {
        for path in args.skip(1) {
            if let Ok(mut file) = fs::File::open(&path) {
                process::<Blake2b, _>(&mut file);
            }
        }
    } else {
        process::<Blake2b, _>(&mut io::stdin());
    }
}
blake-test   $ cargo run hoge.txt
   Compiling blake-test v0.1.0 (/Users/hoge/blake-test)
    Finished dev [unoptimized + debuginfo] target(s) in 0.61s
     Running `target/debug/blake-test hoge.txt`
eefea9ae6b7fb678ed54e6d58d46aed9eae6d003f29419948cdb42a44a7016dee3eb566e7e95c68ac7587d5debd516a3b195eed0db84d72819e387d687fd06a6

可以成功打印&amp;[u8]切片。

但是,我想接收/返回结果而不是打印它们。

【问题讨论】:

  • 非常不清楚这里的问题是什么;你是如何尝试退货的?你知道如何在 Rust 中返回值吗?
  • @Shepmaster 对不起。我想将值传递给一个变量,而不是仅仅做print_result(&amp;sh.result());

标签: hash rust


【解决方案1】:

当你返回一个新创建的对象时,你必须把它作为一个拥有的值返回。

借用引用,例如 &amp;[u8] 是临时的,不能单独存在,它们只是在其他地方以自有形式存储的数据视图。

例如,您可以在切片上调用.to_vec() 并返回Vec&lt;u8&gt;

【讨论】:

    猜你喜欢
    • 2022-07-31
    • 1970-01-01
    • 2018-01-16
    • 2023-03-19
    • 1970-01-01
    • 2019-12-26
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多