hash - 如何从 Rust 中的 Blake2 crate 返回结果?

标签 hash rust

我正在努力使用 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

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

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

最佳答案

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

借用的引用,例如 &[u8]是暂时的,不能单独存在,它们只是数据的 View ,在别处以拥有的形式存储。

例如,您可以调用 .to_vec()在切片上并返回 Vec<u8> .

关于hash - 如何从 Rust 中的 Blake2 crate 返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57496355/

相关文章:

rust - Rust 的生命周期

function - 如何从程序集中调用 Rust 函数?

c# - 在 C# 中比较两个图像的算法

Scala - TrieMap 与 Vector

c# - 使用 Sha256 散列字符串

arrays - Perl:如果值数组相交,则打印 2 个哈希值中的键

string - 如何将整数转换为字符串?

C++ 正在使用 [](int i){return i;} 作为 unordered_set 散列函数的好习惯吗?

rust - 如何将不同的类实例分配给 Rust 中的变量?

generics - 为什么我不能在带有类型参数的特征上添加一揽子实现?