为每个文件名生成新的 MD5 哈希值



只有一个哈希值从VS = hashlib.md5()重复

如何为 for 循环中的每个文件创建新的哈希?

import os
import hashlib
VS = hashlib.md5()    
rootDir = r"C:UsersGhostPicturesWallpaper"
for dirName, subdirList, fileList in os.walk(rootDir, topdown=True):
    print('Directory:', dirName)
    for x in fileList:
        print('Filename: ' , x, 't', VS.hexdigest())

输出:

Directory: C:UsersGhostPicturesWallpaper
Filename:  0020.jpg      d41d8cd98f00b204e9800998ecf8427e
Filename:  2215.jpg      d41d8cd98f00b204e9800998ecf8427e
Filename:  55845.jpg     d41d8cd98f00b204e9800998ecf8427e
Filename:  anon.jpg      d41d8cd98f00b204e9800998ecf8427e
Filename:  Eyes_HD.jpg   d41d8cd98f00b204e9800998ecf8427e
Filename:  gow.jpg       d41d8cd98f00b204e9800998ecf8427e
Filename:  kk.png        d41d8cd98f00b204e9800998ecf8427e
Filename:  scanEQ.txt    d41d8cd98f00b204e9800998ecf8427e
Filename:  scanEQQ.txt   d41d8cd98f00b204e9800998ecf8427e
Filename:  scooby.jpg    d41d8cd98f00b204e9800998ecf8427e
Filename:  skull.jpg     d41d8cd98f00b204e9800998ecf8427e
Filename:  sniper.jpg    d41d8cd98f00b204e9800998ecf8427e

我想我有一个这样的目录:

test
├── callfoo.py
├── folder
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   └── submodule.cpython-35.pyc
│   └── submodule.py
└── inherit.py
2 directories, 6 files

你可以做这样的事情:

import os
import hashlib
def md5_checksum(path, size=1024):
    VS = hashlib.md5()
    with open(path, 'rb') as f:
        for chunk in iter(lambda: f.read(size), b''):
            VS.update(chunk)
    return VS.hexdigest()

rootDir = r"/home/nexus/Bureau/stack/test"
size = 1024
for dirName, subdirList, fileList in os.walk(rootDir, topdown=True):
    for _file in fileList:
        path = dirName + '/' + _file
        checksum = md5_checksum(path, size)
        print('File: {0} t {1}'.format(_file, checksum))

输出:

File: callfoo.py     52cf7effa72135d50d8389bc81c73672
File: inherit.py     919a85d8976d67eea97562a4f8a7e2b9
File: submodule.py   3be5b4123199df6a01b368f2f343821c
File: __init__.py    d41d8cd98f00b204e9800998ecf8427e
File: __init__.cpython-35.pyc    2e4511c482f711fe68bdc825ce658375
File: submodule.cpython-35.pyc   f93d319156617e2cfca3cee88edfcc2a

只需添加VS.update(b"new values"),然后再调用 VS.hexdigest()就足够了:

import os
import hashlib
VS = hashlib.md5()    
rootDir = r"C:UsersGhostPicturesWallpaper"
for dirName, subdirList, fileList in os.walk(rootDir, topdown=True):
    print('Directory:', dirName)
    for x in fileList:
        VS.update(b"new values")
        print('Filename: ' , x, 't', VS.hexdigest())

输出:

Directory: C:UsersGhostPicturesWallpaper
Filename:  0020.jpg      f93df400b2ca81f10a783efaaaa15dc0
Filename:  2215.jpg      6d615abb988407790f84813935cd30c4
Filename:  55845.jpg     552ee02489464cbc4275c4c8c3b0b6dc
Filename:  anon.jpg      7f010718dca450358704027ef6795cae
Filename:  Eyes_HD.jpg   d757c27c29aa9d0fc20fd4de3ff2115f
Filename:  gow.jpg       62f85bab1e15431a3220558c26770f09
Filename:  kk.png        b72aa5609f8dbde778e106a9c5057e23
Filename:  scanEQ.txt    93fedeb3f78a79aa81b76a2e5d58d08d
Filename:  scanEQQ.txt   4d7c1e81a60a43beb682a9840d74a93b
Filename:  scooby.jpg    ec3f07d0cd4e6041a3fed6da097abeab
Filename:  skull.jpg     79df1ae5c8e66b7a3836f2df7939e53e
Filename:  sniper.jpg    9b0571e08b0621107636216ec22fe710

最新更新