首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时计算多个消化量(md5,sha256)?

同时计算多个消化量(md5,sha256)?
EN

Unix & Linux用户
提问于 2014-10-23 10:00:55
回答 2查看 12.8K关注 0票数 30

假设磁盘I/O和空闲RAM是瓶颈(而CPU时间不是限制因素),是否存在可以同时计算多条消息摘要的工具?

我特别感兴趣的是计算MD-5和SHA-256大文件的摘要(千兆字节大小),最好是并行的。我尝试过openssl dgst -sha256 -md5,但它只使用一种算法计算哈希。

预期行为的伪代码:

代码语言:javascript
复制
for each block:
    for each algorithm:
        hash_state[algorithm].update(block)
for each algorithm:
    print algorithm, hash_state[algorithm].final_hash()
EN

回答 2

Unix & Linux用户

发布于 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。

dual_hash.py

代码语言:javascript
复制
#! /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速度。

票数 7
EN

Unix & Linux用户

发布于 2014-10-24 08:28:00

Jacksum是一个独立于平台的免费实用程序,用于计算和验证校验和、CRCs和散列(消息摘要)以及文件的时间戳。(摘自首期手册页)

它具有很大的文件感知能力,它可以处理高达8eB的文件(= 8,000,000,000 G字节),并预先假定您的操作系统--您的文件系统--也是大文件感知的。(摘自http://www.jonelo.de/java/jacksum/)

用法示例:

代码语言:javascript
复制
jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile

样本输出:

代码语言:javascript
复制
md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e
sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

在ubuntu上,运行命令apt-get install jacksum来获得它。

或者,源代码可在

  • http://www.jonelo.de/java/jacksum/#Download
  • http://sourceforge.net/projects/jacksum/
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/163747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档