我使用C#和RHash来计算文件的btih哈希。目前我正在使用3个工具来生成btih哈希:
- 带有
librhash-1.2.9-win
dll的rhash-1.2.9-srcbindingsmono
rhash-1.2.9-win32
命令行工具- uTorrent
问题是,每个工具都会为同一个文件生成不同的btih签名(照片是我拍摄的,它是免费的):
1: 2FF7858CC0A0B216C3676A807D619FA30101E45F
2: E6F07BB3C3B3B67531C84E3452980698AC1B0DAA A:IMG_0400.JPG
3: D0B96839A14A8C45BB81AD157805AE73425998E5
对于C#哈希生成,我在cmd工具中使用Hasher.GetHashForFile(f.Name, HashType.BTIH);
和rhash --bith
。
我做错了什么?有其他方法来计算btih吗?
前两者的区别在于,根据RHash
源代码,BTIH
哈希需要正确计算额外的数据。
calc_sums.c
中的init_btih_data
函数记录为:
初始化BTIH哈希函数。不同于其他算法BTIH需要更多的数据来进行正确的计算。
在test_hashes.c
中,根据是否定义了USE_BTIH_WITH_TEST_FILENAME
,实际上对BTIH
示例进行了不同的处理。
init_btih_data
函数(似乎只有在运行命令行应用程序时才会被调用)又根据各种参数多次调用rhash_trasmit
函数。至少,它会调用两次,这可能解释了前两次之间的区别。然而,它可以称之为其他次数,我认为这解释了我们在uTorrent中看到的差异。
困难在于,虽然非托管DLL公开rhash_trasmit
函数,但.NET绑定不公开,这意味着无法提供所需的额外数据。