美文网首页神奇的py 算法程序员
python新手小例——文件哈希

python新手小例——文件哈希

作者: treelake | 来源:发表于2017-01-29 20:27 被阅读474次

    碰到一个python小例程的网站(也有相关的python教程),随便找了两个例程翻译了下,标题为英文原文链接。

    为了理解下面的内容,你需要如下的python编程基础知识:


    得到文件的哈希值

    哈希函数(又称散列函数)接受任意数量的数据并返回固定长度的位串。函数的输出称为摘要消息(digest message)。
    它们广泛地用于加密认证信息。有许多散列函数,如MD5SHA-1等。参考此页面了解更多关于加密散列函数
    在这个例子中,我们将演示如何哈希文件。我们将使用SHA-1散列算法。 SHA-1产生的摘要是160位长。
    我们不会一次性提取全部文件数据,因为一些文件非常大,会很消耗内存甚至一次性放不下。将文件分割成小块读取将使处理过程高效地使用内存。

    代码-获取散列值
    # Python程序-获取一个文件的SHA-1摘要信息
    
    # 引入hashlib模块
    import hashlib
    
    def hash_file(filename):
       """该函数返回传入文件的SHA-1哈希值"""
    
       # 创建一个哈希对象
       h = hashlib.sha1()
    
       # 以二进制读取模式打开一个文件
       with open(filename,'rb') as file:
    
           # 循环直到文件结束
           chunk = 0
           while chunk != b'':
               # read only 1024 bytes at a time
               chunk = file.read(1024)
               h.update(chunk)
    
       # 返回摘要的十六进制表示
       return h.hexdigest()
    
    message = hash_file("1.gif")
    print(message)
    
    输出
    47d53886c16766d41ce4094cba433e91dc853d57
    

    在这个程序中,我们从hashlib模块中获取哈希函数,以二进制模式打开文件。我们使用while循环读取直到文件结束——文件结束时,我们读取到空字节对象。
    在每次迭代中,我们只从文件中读取1024字节(这个值可以根据我们的愿望改变),并更新散列函数。
    最后,我们使用hexdigest()方法返回十六进制表示的摘要消息。


    得到图像的大小(分辨率)

    实际上使用Pillow库可以方便地获得图像信息,而且这个例程还有些问题,图像的长宽字节的所在位置并不是固定的,而是有另一套规则,不过也可以用来学习下文件和位操作。


    JPEG(Joint Photographic Experts Group)是图像压缩中使用最广泛的压缩技术之一。
    大多数文件格式具有 包含关于文件的有用信息的 标头(最初几个字节)。
    例如,jpeg文件头包含高度,宽度,颜色数量(灰度或RGB)等信息。在这个程序中,我们不使用任何外部库,通过读取jpeg文件头来获取该图片的分辨率。

    代码-获取图片分辨率
     def jpeg_res(filename):
       """该函数打印出传入图片的分辨率"""
    
       # 以二进制读取模式打开图片
       with open(filename,'rb') as img_file:
    
           # 图片高度 (2个字节) 在第164位
           img_file.seek(163)
    
           # 读取两个字节
           a = img_file.read(2)
    
           # 计算高度
           height = (a[0] << 8) + a[1]
    
           # 之后两个字节为宽度
           a = img_file.read(2)
    
           # 计算宽度
           width = (a[0] << 8) + a[1]
    
       print("The resolution of the image is",width,"x",height)
    
    jpeg_res("img1.jpg")
    
    输出
    The resolution of the image is 280 x 280
    

    在这个程序中,我们以二进制模式打开图像。非文本文件必须在此模式下打开。图像的高度位于第164位,紧跟着的是图像的宽度。两者都是2字节长。
    注意,这仅适用于JPEG文件交换格式(JFIF)标准。如果你的图像是使用其他标准(如EXIF)编码,代码将失效。
    我们使用按位移位算符<<将2个字节转换为一个数字(将头一个字节左移8位再加上第二个字节)。最后,显示分辨率。

    相关链接

    相关文章

      网友评论

        本文标题:python新手小例——文件哈希

        本文链接:https://www.haomeiwen.com/subject/rnsupttx.html