python:split_hash

巨大ファイルの分割ハッシュ値算出ツール

クリスマス🎄に Raspbian の最新版をモバイル回線でダウンロードしてきて、速度規制かかった挙句の果てに、sha256 ハッシュ値が一致しなくて破損していてショックを受けて作りました😅💦💦💦
めちゃ急ぎで適当に… エラーチェックも何もしていませんので最悪です🤤

py_split_hash.py
# -*- coding: utf-8 -*-
import hashlib
import argparse
 
def parse_args():
    parser = argparse.ArgumentParser(description='py_split_hash')
    parser.add_argument('input', help='Input file path')
    parser.add_argument('--algo', help='Input algorithm (md5, sha1, sha224, sha256, sha384, sha512)', default = 'sha1')
    parser.add_argument('--size', help='Split size (1,048,576 10,485,760 104,857,600 1,073,741,824 byte)', default = 1048576)
    return parser.parse_args()
 
def main():
    args = parse_args()
    inputFile = args.input
    algo = args.algo
    splitSize = int(args.size)
    readBytes = 0
 
    hash = getattr(hashlib, algo)()
 
    with open(inputFile, 'rb') as f:
        while True:
            chunk = f.read(splitSize)
 
            if len(chunk) == 0:
                break
 
            splitDigest = getattr(hashlib, algo)(chunk).hexdigest()
            print(f'{algo}({readBytes}): {splitDigest}')
            hash.update(chunk)
 
            readBytes += splitSize
 
    digest = hash.hexdigest()
    print(f'{algo}: {digest}')
 
if __name__ == "__main__":
    main()

インターネット上のサーバーなどで分割ハッシュ値を算出する。

$ python py_split_hash.py 2020-12-02-raspios-buster-armhf-full.zip  --algo sha256 --size 104857600
sha256(0): f92ae53a871b26d5aefc6660516b0e1fedb3833c0ef06aaf0eb75f620afb9e0c
sha256(104857600): 56c4a09a3fe1697fa6162fdea7c882abee0c32ac1f9523d9912cbc44b2964def
sha256(209715200): 1d7b379c57672f36394e522ab6bc3f70ccc41e98b06b48f09ab34695ea83e854
sha256(314572800): 53c98eddac01fab4cf63b61f626773a2cceb38082537a003c3c8554144a88095
sha256(419430400): de13ab68c9210c59eb160e3d74d6f69416a890cd7c4d166bc132041231b07d4a
sha256(524288000): 2893f08aef7870dfede943c9297d543a43cd9ea8189fcf581a51520ad3c9adbc
sha256(629145600): 70eb21aac05e50e3a024072a8392f289a25484222742a0d68f8badc712738cc2
sha256(734003200): 645aefc210a0af68c05f97dd502ad1688764fc3d482b3afd01f47604c27aa61c
sha256(838860800): 8f9cd7aed56092f0dcfce5d64dceb44ad37fd7529fb53ae49c5f29ffedbea80d
sha256(943718400): 3ff90042d21ec8fb8ea8bc7cf934b903a8313a9601dfe4a990617d60ae27ad44
sha256(1048576000): baf9ab944e49115987d4b33d2b2b1b302d44fca2d4e252f00161c57b97a8860c
sha256(1153433600): 0535bbee0a12dd8d79c7db61b23eef368b6ddc54be3ee7e56f3eab3e7c3e2073
sha256(1258291200): bc9ce5a9db72357bce8fc5b2ee6b10ae4a5142d5ca0eb43db38acc3b08e25026
sha256(1363148800): aea076ac01610d6b7ca3f022fee9db03b83f0a318b5383d3af630fec767189b4
sha256(1468006400): d6d185a480c34fa85e924dd9e055c9dadd4b616a1b31625dc2f4f41d3bd5e363
sha256(1572864000): 1d85a19248d694a1fee2c0a6a1a34901c5ade51224cc939ef85f69efd39a64c5
sha256(1677721600): 841004ac1d14740f4a48d8033f63e31d3bb892e25e81676f99ab3dc008844423
sha256(1782579200): 3e6e704eb83d96a0107ebafa3647774411059942a266a5c4525387c7e6379c13
sha256(1887436800): c0198eec27fdbea0d02167f3c29f0ed86ee8eef0e6317c0f004f46f46418446b
sha256(1992294400): 9538283c2931c26eb7ec95dfca271d9e78dc6296e4dedb6a60df5804819e4b3b
sha256(2097152000): 537ef1da11c234e66417a626640492695717fd5a0fa1198a5829e4d9010c2a77
sha256(2202009600): 7aa198ada2034a047f7693bf4b806aa330a76b66a9cdbbe00af94dce051b69d5
sha256(2306867200): 875efbde141418717fae5107f838ca8f519ed6c2b511451091e47a9bfbd46832
sha256(2411724800): d565085e8da3185b98883dc4be1512a52ce6fadcab406c04d9a028e52603e93b
sha256(2516582400): 433c2db8eabb9197eb363ff7bc70c49ae01fefad8479506551ee2ae9f9d96fdf
sha256(2621440000): bac2c2cb4df6094aa63490e3996412a4bb391d0070f7bd7b82b04299c99f1f50
sha256(2726297600): 7584dff1074d226e87b2e43f26a5436ade3ad1a15ee47b84b6a4710e485b27f6
sha256(2831155200): 67dbfe7c0d8a66d6195ffbc2a81f3f4e4060ed8364bb56f59cb7e5cb7305b4e8
sha256(2936012800): e66b484ab374c76ecbe5ed17606762eed17af260eadb5111c84eb2fbc8c99254
sha256(3040870400): 3d0be150cf99663bafd3ee3aeb61ca764020d16b77cb05d3bb66d5a046347611
--------------------
sha256(3092088753): cacfd32ae4bc08708a65982abab70c7c99975ae5a9c309b11c4fcf88bf03ac86

ローカルの破損ファイルのハッシュ値を算出する。

$ python .\py_split_hash.py "C:\Users\tomoyan\Downloads\Raspberry Pi\2020-12-02-raspios-buster-armhf-full.zip" --algo sha256 --size 104857600
sha256(0): f92ae53a871b26d5aefc6660516b0e1fedb3833c0ef06aaf0eb75f620afb9e0c
sha256(104857600): 56c4a09a3fe1697fa6162fdea7c882abee0c32ac1f9523d9912cbc44b2964def
sha256(209715200): 1d7b379c57672f36394e522ab6bc3f70ccc41e98b06b48f09ab34695ea83e854
sha256(314572800): 53c98eddac01fab4cf63b61f626773a2cceb38082537a003c3c8554144a88095
sha256(419430400): de13ab68c9210c59eb160e3d74d6f69416a890cd7c4d166bc132041231b07d4a
sha256(524288000): 2893f08aef7870dfede943c9297d543a43cd9ea8189fcf581a51520ad3c9adbc
sha256(629145600): 70eb21aac05e50e3a024072a8392f289a25484222742a0d68f8badc712738cc2
sha256(734003200): 645aefc210a0af68c05f97dd502ad1688764fc3d482b3afd01f47604c27aa61c
sha256(838860800): 8f9cd7aed56092f0dcfce5d64dceb44ad37fd7529fb53ae49c5f29ffedbea80d
sha256(943718400): 3ff90042d21ec8fb8ea8bc7cf934b903a8313a9601dfe4a990617d60ae27ad44
sha256(1048576000): baf9ab944e49115987d4b33d2b2b1b302d44fca2d4e252f00161c57b97a8860c
sha256(1153433600): 0535bbee0a12dd8d79c7db61b23eef368b6ddc54be3ee7e56f3eab3e7c3e2073
sha256(1258291200): bc9ce5a9db72357bce8fc5b2ee6b10ae4a5142d5ca0eb43db38acc3b08e25026
sha256(1363148800): aea076ac01610d6b7ca3f022fee9db03b83f0a318b5383d3af630fec767189b4
sha256(1468006400): d6d185a480c34fa85e924dd9e055c9dadd4b616a1b31625dc2f4f41d3bd5e363
sha256(1572864000): 1d85a19248d694a1fee2c0a6a1a34901c5ade51224cc939ef85f69efd39a64c5
sha256(1677721600): 841004ac1d14740f4a48d8033f63e31d3bb892e25e81676f99ab3dc008844423
sha256(1782579200): 868c5f20ef4616456e395e891017aba401a79b1246752f567415746101854c5a
sha256(1887436800): c0198eec27fdbea0d02167f3c29f0ed86ee8eef0e6317c0f004f46f46418446b
sha256(1992294400): 9538283c2931c26eb7ec95dfca271d9e78dc6296e4dedb6a60df5804819e4b3b
sha256(2097152000): 537ef1da11c234e66417a626640492695717fd5a0fa1198a5829e4d9010c2a77
sha256(2202009600): 7aa198ada2034a047f7693bf4b806aa330a76b66a9cdbbe00af94dce051b69d5
sha256(2306867200): 875efbde141418717fae5107f838ca8f519ed6c2b511451091e47a9bfbd46832
sha256(2411724800): d565085e8da3185b98883dc4be1512a52ce6fadcab406c04d9a028e52603e93b
sha256(2516582400): 433c2db8eabb9197eb363ff7bc70c49ae01fefad8479506551ee2ae9f9d96fdf
sha256(2621440000): bac2c2cb4df6094aa63490e3996412a4bb391d0070f7bd7b82b04299c99f1f50
sha256(2726297600): df5d12c7de6ecb5cde17258c89ecf9e32a58922f90d95cff840611766109eeed
sha256(2831155200): 67dbfe7c0d8a66d6195ffbc2a81f3f4e4060ed8364bb56f59cb7e5cb7305b4e8
sha256(2936012800): e66b484ab374c76ecbe5ed17606762eed17af260eadb5111c84eb2fbc8c99254
sha256(3040870400): 3d0be150cf99663bafd3ee3aeb61ca764020d16b77cb05d3bb66d5a046347611
--------------------
sha256(3092088753): 10f1a13ff1548c5d34c1051acf02f131ed2d1115940cd067bf45b356a4132e44

2 つの出力を比較する。(ファイルの差異のあるバイトブロックが分かります)
WinMerge Comparison

  • python/split_hash.txt
  • 最終更新: 2020/12/26 02:46
  • by ともやん