大文件的快速散列
imohash的Python项目详细描述
imohash是一个快速、恒定时间的哈希库。它使用文件 大小和采样以快速计算哈希值,而不考虑文件大小。 它最初是作为Go library发布的。
imosum是从命令行散列文件的示例应用程序,类似于 MD5总和。
安装
pip install imohash
用法
作为库:
fromimohashimporthashfilehashfile('foo.txt')'O\x9b\xbd\xd3[\x86\x9dE\x0e3LI\x83\r~\xa3'hashfile('foo.txt',hexdigest=True)'a608658926d8aa86b3db8208ad279bfe'# just hash the whole file if smaller then 200000 bytes. Default is 128Khashfile('foo.txt',sample_threshhold=200000)'x86\x9dE\x0e3LI\x83\r~\xa3O\x9b\xbd\xd3[E'# use samples of 1000 bytes. Default is 16Khashfile('foo.txt',sample_size=1000)'E\x0e3LI\x83\r~\xa3O\x9b\xbd\xd3[E\x23\x25'# hash an already opened filef=open('foo.txt')hashfileobject(f)'O\x9b\xbd\xd3[\x86\x9dE\x0e3LI\x83\r~\xa3'# hash a file on a remote serverimportparamikossh=paramiko.SSHClient()ssh.connect('host',username='username',password='verysecurepassword')ftp=ssh.open_sftp()hashfileobject(ftp.file('/path/to/remote/file/foo.txt'))'O\x9b\xbd\xd3[\x86\x9dE\x0e3LI\x83\r~\xa3'
或从命令行:
imosum *.jpg
使用
因为imohash只读取文件数据的一小部分,所以它非常 快速且非常适合文件同步和重复数据消除, 尤其是在一个相当慢的网络上。需要管理媒体(照片 和视频)在NAS和多台家庭计算机之间通过Wi-Fi 图书馆诞生了。
如果你只需要检查两个文件是否相同 采样的局限性(见下文),imohash可能是一个很好的 合身。
误用
因为imohash只读取文件数据的一小部分,所以它不是 适用于:
- 文件验证或完整性监视
- 操作固定大小文件的情况
- 任何加密
设计
(注意:在algorithm description中提供了更精确的描述。)
imohash的工作原理是从一开始就对小块数据进行哈希处理, 文件的中间和结尾。它还将文件大小合并到 最后的128位哈希。这种方法基于一些假设 将因应用程序而异。首先,仅文件大小往往是 很好的区分,特别是随着文件大小的增加。什么时候 人们处理文件(如编辑照片),大小往往 改变。所以大小直接用于散列,并且任何具有 不同的大小将有不同的散列。
大小是一个有效的区分因素,但还不够。它可以显示 这两个文件不一样,但为了增加信心 就像大小文件一样,一些段使用 murmur3,一个快速的 有效的哈希算法。默认情况下,从一开始就有16K块, 使用文件的中间和结尾。文件的结尾通常包含 在不影响文件大小的情况下更容易更改的元数据。 中间是很好的尺度。样本大小可以根据您的 申请。
1在要检查的文件样本上尝试du -a . | sort -nr | less。 这个断言。
小文件豁免
小文件比大文件更容易在大小上发生冲突。他们是 也可能更可能以微妙的方式改变抽样将 未命中(例如编辑大文本文件)。因此,伊莫哈什将 如果小于128K,只需散列整个文件。 也可配置。
性能
标准哈希性能指标对于imohash来说没有意义,因为 它只读取有限的一组数据。也就是说,现实世界 性能非常好。如果使用大文件和/或 慢网络,期待巨大的加速。(spoiler:读取48K更快 比读取500MB。)
名称
灵感来自ILS marker beacons。