为文件系统中的每个文件创建哈希值

3 投票
3 回答
3415 浏览
提问于 2025-04-17 17:54

我正在尝试写一个程序,这个程序可以为系统中的每个文件生成一个哈希值,不管是Windows、Linux还是Unix系统。然后,这个脚本会把生成的哈希值和一个已知的坏哈希值文件进行对比。如果文件系统中的某个哈希值和坏哈希值文件中的某个值匹配,就打印出有匹配的结果。有没有什么好的方法可以实现这个?

我刚学Python,想知道最有效的做法是什么。

3 个回答

0

首先,创建一个你想要检测的哈希值的集合:

badHash_set = set(['1234', 'abcd'])

然后在你想要检查的目录树的根目录上使用 os.walk:

http://docs.python.org/2/library/os.html#os.walk

for root, dirs, files in os.walk(base_path):
    for file_str in files:
        file_obj = file(os.path.join(root, file_str))
        file_md5 = hashlib.md5(file_obj.read()).hexdigest()

        if file_md5 in badHash_set:
            # ...complain

不过,这个过程可能会非常慢。现在还不确定这会不会成为一个问题。

1

我写了一个模块,可以对一个文件夹及其子文件夹里的文件进行哈希处理。处理后的结果是一个以json格式呈现的树形结构。

pip3 install py_essentials

使用这个模块的方法如下:

from py_essentials import hashing as hs
hashtree = hs.createHashtree("path/to/the/directory/", 'sha1')

想了解更多关于这个功能的信息,可以查看文档

下面是一个例子,展示了用json.loads()json.dumps()打印出来的结果是什么样的。

{
    "LICENSE": "1e69fdee9a5b6a177b20178014ffd56e0f64c417",
    ".gitignore": "182ba25cd720d7a2be1314927f9fa72604a9fda7",
    "MANIFEST": "b7efe1149685a1e858b4a83242a5eefbe263e00e",
    "README.md": "63b6fda48fd270e620a3defa9f960a1081d15132",
    "setup.py": "81b0b4bcb7e9076986b7135c01dd1969aedfb256",
    "setup.cfg": "7bc6f4c388d1e0409aee1f79c557b6ce3a3e9511",
    "examples": {
        "advancedList-example1.py": "615082e89704bce44b2b8a78b2738c590efcbf83"
    },
    "py_essentials": {
        "fileHandler.py": "03611c13ab37a15d8d04e79711475114fe818a08",
        "hashing.py": "5a7c77ecfa670309fb685a50ba75b1c9b2fbf161",
        "checkup.py": "95743567715213d57f0e5e6cfbb42521c5a2b661",
        "xcptns.py": "e053b7e4923ba270a7971624802efb32fd480ebb",
        "simpleRandom.py": "a1ded44a7f707c2b0530e18a4f144665e9ad759a",
        "__pycache__": {
            "exceptions.cpython-36.pyc": "ec8c20db40523c09ee51616c4e1b250bb2a0825b",
            "advancedList.cpython-36.pyc": "eeed573a2ec8187315f414e61cd5e6e083a5151d",
            "hashing.cpython-36.pyc": "ea966ec926ed9516df7d332e45a6a411f88a3b7d",
            "prettyPrinting.cpython-36.pyc": "c623260362e08ebfebf229681c357923eee85289",
            "xcptns.cpython-36.pyc": "a2538519fd5fd37f67b73272a7077b93861589ca",
            "__init__.cpython-36.pyc": "e25ee2a75c14026a2dc20170b1b3f8fe3f77069e",
            "simpleRandom.cpython-36.pyc": "1968cf15b29472c855679c71dd5b862d5bec1d26",
            "checkup.cpython-36.pyc": "982fb978040d168e888f6a389a259cc06d32d815",
            "fileHandler.cpython-36.pyc": "0995fea9dfeae4740a77284a8eae19d9231c083f"
        },
        "advancedList.py": "41e9275662562da582326757cf3c9eb7bcc031dd",
        "prettyPrinting.py": "b5244c76e5c33203b2d843705e62d1552b241db0",
        "__init__.py": "5736a4b7e59efc4191665edb471a9282d2fd642e",
        "test.py": "088d1b9786d5f4a3bf02f207a95b3b173cb636e2"
    },
    "dist": {
        "py_essentials-1.4.11.tar.gz": "a8a7f93f1fe3aa263369e6b26fbafae6ed7dbd37",
        "py_essentials-1.4.7.tar.gz": "8c4788c388d64bae1c740a21b200a9d95cf014d6",
        "py_essentials-1.4.10.tar.gz": "e632e6093a1ceb602726e3c0848692b0d4205dd9",
        "py_essentials-1.4.5.tar.gz": "a576e66b2f41a629d55ad585993b819bf3960d40",
        "py_essentials-1.4.9.tar.gz": "bc6786fbeb5be254e5c05215779a3c37a427f398",
        "py_essentials-1.4.6.tar.gz": "08f8dffdb57e7ee4aa99b0494f2b5ae529aae85a",
        "py_essentials-1.4.8.tar.gz": "16c4fff88823c7900d3bb7ecfb489916315ca492"
    }
}

之后,你可以递归地遍历这个树形结构,并将哈希值与一个坏哈希值的列表进行比较。

4

要在文件系统中遍历文件,可以使用 os.walk 这个工具。对于每个文件,你可以使用内置的库 hashlib 来创建一个哈希值。

下面是一个简单的示例:

import os, hashlib

current_dir = os.getcwd()
for root,dirs,files in os.walk(current_dir):
    for f in files:
        current_file = os.path.join(root,f)
        H = hashlib.md5()

        with open(current_file) as FIN:
            H.update(FIN.read())

        print current_file, H.hexdigest()

撰写回答