python新手小例——文件哈希

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

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

  • Python 函数
  • Python 用户定义函数
  • Python 文件 I/O

得到文件的哈希值

python新手小例——文件哈希_第1张图片

哈希函数(又称散列函数)接受任意数量的数据并返回固定长度的位串。函数的输出称为摘要消息(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库可以方便地获得图像信息,而且这个例程还有些问题,图像的长宽字节的所在位置并不是固定的,而是有另一套规则,不过也可以用来学习下文件和位操作。


python新手小例——文件哈希_第2张图片

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 Program to Find the Size (Resolution) of a Image
  • Python Program to Merge Mails
  • Python Program to Convert Decimal to Binary, Octal and Hexadecimal

你可能感兴趣的:(python新手小例——文件哈希)