我使用这个代码来计算哈希值的文件:
m = hashlib.md5()
with open("calculator.pdf", 'rb') as fh:
while True:
data = fh.read(8192)
if not data:
break
m.update(data)
hash_value = m.hexdigest()
print hash_value
当我在一个文件夹“文件夹“上试用时,我得到了
IOError: [Errno 13] Permission denied: folder
如何计算文件夹的哈希值?
7条答案
按热度按时间lvjbypge1#
使用checksumdirpython包来计算目录的校验和/散列。它可以在https://pypi.python.org/pypi/checksumdir上找到
用法:
jutyujz02#
下面是一个使用pathlib.Path而不是os. walk的实现。它在迭代之前对目录内容进行排序,以便在多个平台上可以重复。它还使用文件/目录的名称更新哈希,因此添加空文件和目录将更改哈希。
带类型注解的版本(Python 3.6或更高版本):
不带类型注解:
如果您只需要散列目录,则为压缩版本:
用法:
md5_hash = md5_dir("/some/directory")
2eafrhcq3#
这个Recipe提供了一个很好的函数来完成您所要求的任务,我已经将它修改为使用MD5散列,而不是您最初的问题所要求的SHA1
您可以像这样使用它:
输出如下所示,因为它散列了每个文件:
此函数调用的返回值作为散列返回。
lf5gs5x24#
我不太喜欢答案中提到的菜谱是怎么写的,我有一个更简单的版本:
我发现每当遇到
alias
之类的东西(显示在os.walk()
中,但您不能直接打开它)时,通常都会抛出异常。如果在我试图哈希的目录中有一个实际的文件,但它无法打开,跳过该文件并继续不是一个好的解决方案。这会影响哈希的结果。最好完全终止哈希尝试。在这里,
try
语句将被 Package 在对hash_directory()
函数的调用周围。kse8i1jr5#
我不断看到这个代码通过各种论坛传播。
ActiveState recipe answer可以工作,但是,正如Antonio指出的,它不能保证跨文件系统的可重复性,因为它不能以相同的顺序显示文件(试试看)。
到
(Yes我太懒了。这只对文件名排序,而不对目录排序。同样的原理也适用)
vbkedwbf6#
使用校验和目录https://pypi.org/project/checksumdir/
xtfmy6hx7#
我进一步优化了安迪的回答。
下面是python3而不是python2的实现,它使用SHA1,处理一些需要编码的情况,是linted的,并且包含一些教义。