python md5去重加密

1、背景:
网络爬虫下载的文件,需要去重,选择python 的hashlib 或者md5计算hash值去重
2、实测:
一般对文件计算md5采用的方法是使用命令行

md5sum path/filename

python中试下那类似功能的时使用md5(python 2.5之前和hashlib(python2.5之后)
最简单的实现:

#!/usr/bin/env python
#coding : utf-8

import sys
import hashlib

def md5sum(filename):
    file_object = open(filename, 'rb')
    file_content = file_object.read()
    file_object.close()
    file_md5 = hashlib.md5(file_content)
    return file_md5

if __name__ == "__main__":
    file_md5 = md5sum(sys.argv[1])
    print file_md5.hexdigest()

注意,需要以二进制的方式读入文件,若写成hashlib.md5(filename),则会变成对字符串filename计算md5

另外对较大文件进行校验,一次性读入太大内容,导致性能低下,故一般读取部分进行处理。

# 大文件的MD5值
    def getFileMd5(self, filename):
        if not os.path.isfile(filename):
            return
        myhash = hashlib.md5()
        f = file(filename, 'rb')
        while True:
            b = f.read(8096)
            if not b:
                break
            myhash.update(b)
        f.close()
        return myhash.hexdigest()

每次读取8096字节的内容,使用myhash.update(b)进行累计。

参考:https://www.cnblogs.com/zhjsll/p/5897443.html

<think>嗯,用户想了解如何用MD5实现图片算法。首先,我得回忆一下MD5的基本原理。MD5是一种哈希算法,能把任意长度的数据生成固定长度的摘要,通常是32位的十六进制字符串。根据引用里的信息,每个文件的MD5值都是唯一的,就像指纹一样,所以如果两个文件的MD5值相同,就可以认为它们是相同的文件,这样就实现了。 那具体怎么操作呢?首先,我需要读取图片文件的二进制内容,然后计算其MD5哈希值。根据引用[3]和[4],Python的hashlib库已经提供了MD5的实现,直接调用就行。步骤大概是这样的:打开图片文件,读取内容,用hashlib的md5()函数生成摘要,然后比较这些摘要值是否复。如果有复的MD5值,就删除其中一个,达到的目的。 不过,用户可能会遇到一些问题。比如,虽然MD5在理论上是唯一的,但实际上存在哈希碰撞的可能性,即不同的文件可能生成相同的MD5值。不过,引用[2]提到MD5是单向散列算法,虽然现在已经被证明不安全,但对于图片这种非加密用途来说,碰撞的概率极低,可能可以接受。但如果是高安全要求的场景,可能需要考虑其他更安全的哈希算法,比如SHA-256。 另外,处理大文件的时候,直接读取整个文件可能会占用太多内存。这时候可以分块读取,比如每次读取4096字节,逐步更新MD5对象,这样内存占用会更低。引用[4]也提到Python的hashlib库支持这种方法,所以应该没问题。 还有,用户可能需要存储已经计算过的MD5值,以便后续比较。可以用一个字典或者集合来保存已有的哈希值,当新计算的哈希值已经存在时,就标记为复文件。这样遍历所有图片后,就能找出所有复项了。 最后,用户可能想知道具体的代码实现。根据引用[3]和[4],代码大致结构应该是使用os模块遍历文件,用hashlib计算MD5,然后用字典记录哈希和文件路径。复的MD5对应的文件就是需要删除的。需要提醒用户注意,删除文件前最好备份,防止误删。 总结一下,步骤是:计算每个图片的MD5哈希,存储并比较这些哈希值,复的即为复图片。同时要考虑哈希碰撞和内存管理的问题,以及代码的具体实现方法。</think>### 如何使用MD5实现图片算法? #### 实现原理 MD5算法通过将文件内容映射为唯一的128位哈希值(通常表示为32位十六进制字符串)实现。**核心逻辑是:若两个文件的MD5值相同,则认为内容相同**(假设无哈希碰撞)[^2][^3]。 #### 实现步骤 1. **读取图片二进制数据** MD5算法基于文件内容而非文件名生成哈希值,需以二进制模式读取文件: ```python with open("image.jpg", "rb") as f: content = f.read() ``` 2. **计算MD5哈希值** 使用Python的`hashlib`库生成摘要: ```python import hashlib def get_md5(file_path): md5 = hashlib.md5() with open(file_path, "rb") as f: # 分块读取避免大文件内存溢出 for chunk in iter(lambda: f.read(4096), b""): md5.update(chunk) return md5.hexdigest() ``` 3. **哈希值对比与** ```python import os md5_dict = {} for root, dirs, files in os.walk("图片目录"): for filename in files: filepath = os.path.join(root, filename) file_md5 = get_md5(filepath) if file_md5 in md5_dict: # 发现复文件 os.remove(filepath) # 删除复文件 print(f"复文件已删除: {filepath}") else: md5_dict[file_md5] = filepath ``` #### 注意事项 1. **哈希碰撞风险** 理论上不同文件可能生成相同MD5值,但实际概率极低(约$1.47 \times 10^{-29}$)[^2]。对普通图片可忽略该风险,若需更高安全性可改用SHA-256。 2. **文件读取优化** - 分块读取(如`f.read(4096)`)避免大文件导致内存溢出 - 文件修改时间等元数据不参与计算,仅依赖内容本身 3. **扩展应用** 可结合文件大小预筛选:先比较文件大小,大小不同则直接跳过MD5计算,提升效率[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值