2个稳定版本
1.0.1 | 2023年5月19日 |
---|
#920 in 算法
17KB
366 行
ED2K哈希函数
该库实现了ED2K哈希函数的多种版本,如https://mldonkey.sourceforge.net/Ed2k-hash所述,并与其他实现进行了验证。
该算法大致工作原理如下
- 数据被分成9500 KiB的块,最后一个块可能更小。
- 每个块都使用MD4算法进行哈希。
- 如果文件小于单个块,则结果是第一个块的哈希。
- 否则,结果是所有连接块哈希的MD4哈希。
结果表明,当ED2K算法最初发布时,其描述中存在歧义,这允许有两种实现方式,导致工具中的实现存在差异。这种歧义似乎后来得到了解决,替代行为现在被视为一个错误,并在参考实现中进行了修复。
此crate实现了两种形式,以及同时计算这两种形式的有效方法
- Ed2k "红色:这是原始的,“有问题的”哈希函数。如果数据是块大小的倍数,则在其计算中将在末尾包含一个额外的0字节大小的块。
- Ed2k "蓝色”:这是较新的“固定”哈希函数。如果数据是块大小的倍数,则只包括那些块在其计算中末尾。
- Ed2k "红蓝”:这仅仅是“红色”哈希与“蓝色”哈希的连接。这作为一个方便的技巧存在,以便在同时高效计算两种ED2K哈希版本的同时使用相同的哈希API。
示例
use digest::Digest;
use ed2k::{Ed2k, Ed2kRed, Ed2kBlue};
// Compute a ED2K hash.
let hash = Ed2k::digest(b"hello world");
assert_eq!(format!("{hash:x}"), "aa010fbc1d14c795d86ef98c95479d17");
// Difference between blue and red flavors.
// The two only differ for data that ends on a chunk boundary.
let data = vec![0x55; 9728000];
let red_hash = Ed2kRed::digest(&data);
let blue_hash = Ed2kBlue::digest(&data);
assert_eq!(format!("{red_hash:x}"), "49e80f377b7e4e706dbd3ecc89f39306");
assert_eq!(format!("{blue_hash:x}"), "4127a47867b6110f0f86f2d9845fb374");
依赖关系
~340KB