【发布时间】:2021-06-28 11:41:24
【问题描述】:
我想将哈希函数的输出打印到标准输出。我使用 groestl 哈希函数,但我想它与 sha 或其他函数相同。这样做会按应有的方式打印散列:
fn create_hash<D: Digest>(msg: &str, mut hasher: D) -> GenericArray<u8, D::OutputSize> {
hasher.update(msg);
hasher.finalize()
}
fn main() {
let hasher = Groestl256::default();
let res = create_hash("asdfasdf", hasher);
println!("{:x}", res);
}
输出:db102d374ae45b130ae49e91dcc7b648b86ba1a0415a32dcce7806d46f316460
现在我想做一个匹配以使其他算法(Groestl512,...)也可用。
let dig = match algorithm {
HashTypes::groestl224 => {
create_hash(message.as_ref().unwrap(), Groestl224::default())
}
HashTypes::groestl256 => {
create_hash(message.as_ref().unwrap(), Groestl256::default())
}
HashTypes::groestl384 => {
create_hash(message.as_ref().unwrap(), Groestl384::default())
}
HashTypes::groestl512 => {
create_hash(message.as_ref().unwrap(), Groestl512::default())
}
};
let res = HashGroestl::create_hash("asdfasdf", Groestl256::default());
println!("Result: {:x}", res);
由于返回数组的大小不同,这会导致匹配臂具有不兼容的类型。我试图通过返回一个字符串而不是 GenericArray 来绕过这个。
当我想用format!("{:x}", hasher.finalize()) 从create_hash 返回一个字符串时,会出现以下错误:
cannot add `<D as groestl::Digest>::OutputSize` to `<D as groestl::Digest>::OutputSize`
the trait `std::ops::Add` is not implemented for `<D as groestl::Digest>::OutputSize`
required because of the requirements on the impl of `std::fmt::LowerHex` for `aes::cipher::generic_array::GenericArray<u8, <D as groestl::Digest>::OutputSize>`
required by `std::fmt::LowerHex::fmt`
我还尝试将数组转换为 Vec 或使用 .as_slice()。
那么我怎样才能像上面一样返回字符串或使匹配臂兼容?
编辑:好的,刚刚在Generic function to compute a hash (digest::Digest trait) and get back a String 中找到了以字符串形式返回的解决方案。 但是让火柴臂兼容的另一部分仍然让我感兴趣,所以如果有人对此有答案,欢迎您!
【问题讨论】:
标签: hash rust cryptography