MD5ハッシュ

公共データベースで公開されている FASTQ ファイルや BAM ファイルのサイズは数百 MB から数 GB にも及ぶ。そのため、ダウンロードが正常に完了できなかったり、ダウンロード中に一部の内容が損傷したりする可能性が大きくなる。そのため、ダウンロードしてきたファイルに対して解析を行う前に、ローカルにダウンロードしてきたファイルが、公共データベースで公開されているファイルと同じであることを確認する必要がある。

それを確認する方法の一つとして、両方のファイルの内容からハッシュ値を計算して、ハッシュ値が一致するかどうか調べることである。公共データベースでは、データが公開されていると同時に、ハッシュ値も合わせて公開されている。そのため、ローカルにダウンロードしてきたファイルのハッシュ値を計算し、計算されたハッシュ値と公共データベースで公開されたハッシュ値を見比べることで、ダウンロードが正しく行われたかっどうかを判断できるようになる。

Linux コマンドでハッシュ値(MD5)を調べる方法

Linux 上でファイルのハッシュ値(MD5)を調べるには md5sum コマンドを使用する。

md5sum SRR6799256_1.clean.fastq.gz
e8613c2c4887068547c3ea42ff2a5aac  SRR6799256_1.clean.fastq.gz

Python でハッシュ値(MD5)を調べる方法

Python でハッシュ値 MD5 を調べるには hashlib ライブラリーを使用する。本来はファイルの中身をすべて読み込んでからハッシュ値を計算するが、ファイルサイズが大きくなると、メモリの制限でファイル内容をすべて読み込めなくなる。そこで、ファイルを数 KB ずつ読み込んで、ハッシュ値をすこしずつ更新していくような方法をとると、メモリの問題を回避できる。

import glob
import hashlib

# 
# python checkMD5.py
# 

def check_MD5(infile_path):
    hash = hashlib.md5()

    with open(infile_path, 'rb') as infh:
        while True:
            chunk = infh.read(2048 * hash.block_size)
            if len(chunk) == 0:
                break
            hash.update(chunk)
    return hash.hexdigest()


if __name__ == '__main__':
    for fq_file in glob.glob('*.gz'):
        md5 = check_MD5(fq_file)
        print(fq_file + ' ' + md5)

上のコードを checkMD5.py という名前でファイルに保存すれば、次のように実行できる。ただし、このファイルを FASTQ (*.gz) と同じディレクトリに置く必要がある。

python checkMD5.py
## SRR6799268_1.fastq.gz1a82affe67b104840af690f49ee855f3
## SRR6799259_1.fastq.gzeb901f74c883c4774d2f1df4b4cfbd44
## SRR6799263_1.fastq.gz225cb6eb73f8e74fceb60769828d1673
## SRR6799265_1.fastq.gz3733f01f5e85b1fc34dba5896f52ff99
## SRR6799268_2.fastq.gz67d549c1af2af8f69a6b4f1e9187971f
## SRR6799259_2.fastq.gzd33166b33b1dec8eabded24344f44432
## SRR6799263_2.fastq.gz12d60e0f97b651b74fae1c2ef9d242d8
## SRR6799265_2.fastq.gz0cb7056916ae3994bf033b17f56849ac