假设磁盘I/O和空闲RAM是瓶颈(而CPU时间不是限制因素),是否存在可以同时计算多条消息摘要的工具?
我特别感兴趣的是计算MD-5和SHA-256大文件的摘要(千兆字节大小),最好是并行的。我尝试过openssl dgst -sha256 -md5,但它只使用一种算法计算哈希。
预期行为的伪代码:
for each block:
for each algorithm:
hash_state[algorithm].update(block)
for each algorithm:
print algorithm, hash_state[algorithm].final_hash()发布于 2014-10-23 11:36:45
令人遗憾的是,openssl实用程序不接受多个摘要命令;我想对多个文件执行相同的命令是一种更常见的使用模式。FWIW,在我的系统上的openssl实用程序(Mepis 11)的版本只有针对sha和sha1的命令,而没有任何其他的sha变体。但我确实有一个名为sha256sum的程序,以及md5sum。
下面是一个简单的Python程序,dual_hash.py,它可以满足您的需要。一个64k的块大小似乎是最适合我的机器(英特尔奔腾4 2.00GHz与2G的RAM),YMMV。对于小型文件,其速度与连续运行md5sum和sha256sum大致相同。但对于较大的文件,它的速度要快得多。例如,在1967063040字节文件( SD卡的磁盘映像中装满了mp3文件)上,md5sum + sha256sum大约需要1m44.9s,dual_hash.py需要1m0.312s。
#! /usr/bin/env python
''' Calculate MD5 and SHA-256 digests of a file simultaneously
Written by PM 2Ring 2014.10.23
'''
import sys
import hashlib
def digests(fname, blocksize):
md5 = hashlib.md5()
sha = hashlib.sha256()
with open(fname, 'rb') as f:
while True:
block = f.read(blocksize)
if not block:
break
md5.update(block)
sha.update(block)
print("md5: %s" % md5.hexdigest())
print("sha256: %s" % sha.hexdigest())
def main(*argv):
blocksize = 1<<16 # 64kB
if len(argv) < 2:
print("No filename given!\n")
print("Calculate md5 and sha-256 message digests of a file.")
print("Usage:\npython %s filename [blocksize]\n" % sys.argv[0])
print("Default blocksize=%d" % blocksize)
return 1
fname = argv[1]
if len(argv) > 2:
blocksize = int(sys.argv[2])
print("Calculating MD5 and SHA-256 digests of %r using a blocksize of %d" % (fname, blocksize))
digests(fname, blocksize)
if __name__ == '__main__':
sys.exit(main(*sys.argv))我认为这个程序的C/C++版本会更快一些,但不会太多,因为大部分工作都是由用C(或C++)编写的hashlib模块完成的。正如上面提到的,大文件的瓶颈是IO速度。
发布于 2014-10-24 08:28:00
Jacksum是一个独立于平台的免费实用程序,用于计算和验证校验和、CRCs和散列(消息摘要)以及文件的时间戳。(摘自首期手册页)
它具有很大的文件感知能力,它可以处理高达8eB的文件(= 8,000,000,000 G字节),并预先假定您的操作系统--您的文件系统--也是大文件感知的。(摘自http://www.jonelo.de/java/jacksum/)
用法示例:
jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile样本输出:
md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e
sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855在ubuntu上,运行命令apt-get install jacksum来获得它。
或者,源代码可在
https://unix.stackexchange.com/questions/163747
复制相似问题