使用Python计算文件和文本的多种Hash值
作者:小木_.
这篇文章主要为大家详细介绍了如何使用Python计算文件和文本的多种Hash值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
本文将使用Python编写的GUI应用,具备文件拖拽功能,能够计算文件和文本的多种Hash值,包括MD5、SHA1、SHA224、SHA256、SHA384、SHA512以及CRC32。
具体界面效果如下
导入模块
import tkinter from tkinter import * import tkinter as tk from tkinter.ttk import * import tkinter.filedialog import pyperclip import windnd import hashlib import sys import zlib
简单框架
root = Tk() root.title('贱工坊-Hash计算') # 程序的标题名称 root.geometry("580x400+512+288") # 窗口的大小及页面的显示位置 root.resizable(False, False) # 固定页面不可放大缩小 root.iconbitmap("picture.ico") # 程序的图标
为界面添加图片及要拖拽框架的指向位置
canvas = tkinter.Canvas(root, bg="#ebebeb", height=400, width=700, borderwidth=-3) # 创建画布 canvas.pack(side='top') # 放置画布(为上端) try: image_file = tkinter.PhotoImage(file="./Along.png") # 加载图片文件 canvas.create_image(0, 0, anchor='nw', image=image_file) # 将图片置于画布上 except: pass photo = PhotoImage(file="./ZCY.png") theLabel = Label(root,image=photo) theLabel.place(x=450,y=20)
多行文本框,一个是输入,一个是输出
ScrolledText = Text(root, width=60, height=12) ScrolledText.place(x=1,y=1) ScrolledText_file = Text(root, width=60, height=12) ScrolledText_file.place(x=1,y=236)
用来转换文件hash
# 文件转换 def file(files): ScrolledText_file.delete(0.0, END) msg = '\n'.join((item.decode('gbk') for item in files)) try: # md5值 def file(filete): with open(filete, 'rb') as fd: md5obj = hashlib.md5() md5obj.update(fd.read()) hashv1 = md5obj.hexdigest() return hashv1 # sha1值 def JMSHA1(filete): sha1jiami = hashlib.sha1() try: a = open(fr'{filete}', 'rb') except: print('文件路径有误,请输入正确路径!') return 0 while True: b = a.read(128000) # 这里就是每次读文件放进内存的大小,小心溢出! sha1jiami.update(b) if not b: break a.close() jiamijieguo = sha1jiami.hexdigest() return jiamijieguo # sha224值 def CalcFileSha224(filete): with open(filete, "rb") as f: # sha224 sha224obj = hashlib.sha224() sha224obj.update(f.read()) hash_value_224 = sha224obj.hexdigest() return hash_value_224 # sha256值 def CalcFileSha256(filete): with open(filete, "rb") as f: sha256obj = hashlib.sha256() sha256obj.update(f.read()) hash_value = sha256obj.hexdigest() return hash_value # sha384值 def CalcFileSha384(filete): with open(filete, "rb") as f: # sha384 sha384obj = hashlib.sha384() sha384obj.update(f.read()) hash_value_384 = sha384obj.hexdigest() return hash_value_384 # sha512值 def CalcFileSha512(filete): with open(filete, "rb") as f: # sha512 sha512obj = hashlib.sha512() sha512obj.update(f.read()) hash_value_512 = sha512obj.hexdigest() return hash_value_512 # CRC值 def crc32(filete): block_size = 1024 * 1024 crc = 0 try: fd = open(filete, 'rb') while True: buffer = fd.read(block_size) if len(buffer) == 0: # EOF or file empty. return hashes fd.close() if sys.version_info[0] < 3 and crc < 0: crc += 2 ** 32 return crc # 返回的是十进制的值 crc = zlib.crc32(buffer, crc) except Exception as e: if sys.version_info[0] < 3: error = str(e) pass else: error = str(e) return 0, error ScrolledText_file.insert("end", f"************ ************\n{msg}\n\t\t ↓↓↓值转换完毕↓↓↓\nMD5值:\n{file(msg)}\n\nsha1值:\n{JMSHA1(msg)}\n\nsha224值:\n{CalcFileSha224(msg)}\n\nsha256值:\n{CalcFileSha256(msg)}\n\nsha384值:\n{CalcFileSha384(msg)}\n\nsha512值:\n{CalcFileSha512(msg)}\n\ncrc32值:\n{hex(crc32(msg))}\n************ ************\n\n") except: ScrolledText_file.insert("end", f"[转换失败!!!]\n----↓↓↓----\n{msg}\n----↑↑↑----\t \n\n")
用来转换文本hash
# 文本转换 def hash_s(): MD5 = ScrolledText.get(1.0, END).strip().replace("\n", "").encode() ScrolledText_file.delete(0.0, END) #MD5 md5obj = hashlib.md5() md5obj.update(MD5) hashv1 = md5obj.hexdigest() #sh1 SH1 = ScrolledText.get(1.0, END).strip() hash_sha1 = hashlib.sha1(SH1.encode('utf8')).hexdigest() # sha224 sha224obj = hashlib.sha224() sha224obj.update(MD5) hash_value_224 = sha224obj.hexdigest() #sha256 sha256obj = hashlib.sha256() sha256obj.update(MD5) hash_value = sha256obj.hexdigest() # sha384 sha384obj = hashlib.sha384() sha384obj.update(MD5) hash_value_384 = sha384obj.hexdigest() # sha512 sha512obj = hashlib.sha512() sha512obj.update(MD5) hash_value_512 = sha512obj.hexdigest() # blake2b blake2b = hashlib.blake2b() blake2b.update(MD5) hash_value_blake2b = blake2b.hexdigest() # blake2s blake2s = hashlib.blake2s() blake2s.update(MD5) hash_value_blake2s = blake2s.hexdigest() ScrolledText_file.insert("end", 'MD5值:' + hashv1+'\n\nsha1值:'+hash_sha1+'\n\nsha224值:'+hash_value_224+'\n\nsha256值:'+hash_value+'\n\nsha384值:'+hash_value_384+'\n\nsha512值:'+hash_value_512) ScrolledText_file.insert("end", '\n\nblake2b值:' + hash_value_blake2b+'\n\nblake2s值:' + hash_value_blake2s)
文件拖拽的核心
windnd.hook_dropfiles(theLabel, func=file) # 背景
运行: 我已经打包过了
完整代码:
import tkinter from tkinter import * import tkinter as tk from tkinter.ttk import * import tkinter.filedialog import pyperclip import windnd import hashlib #加密 import sys import zlib root = Tk() root.title('贱工坊-Hash计算') # 程序的标题名称 root.geometry("580x400+512+288") # 窗口的大小及页面的显示位置 root.resizable(False, False) # 固定页面不可放大缩小 root.iconbitmap("picture.ico") # 程序的图标 canvas = tkinter.Canvas(root, bg="#ebebeb", height=400, width=700, borderwidth=-3) # 创建画布 canvas.pack(side='top') # 放置画布(为上端) try: image_file = tkinter.PhotoImage(file="./Along.png") # 加载图片文件 canvas.create_image(0, 0, anchor='nw', image=image_file) # 将图片置于画布上 except: pass photo = PhotoImage(file="./ZCY.png") theLabel = Label(root,image=photo) theLabel.place(x=450,y=20) ScrolledText = Text(root, width=60, height=12) ScrolledText.place(x=1,y=1) ScrolledText_file = Text(root, width=60, height=12) ScrolledText_file.place(x=1,y=236) # 文件转换 def file(files): ScrolledText_file.delete(0.0, END) msg = '\n'.join((item.decode('gbk') for item in files)) try: # md5值 def file(filete): with open(filete, 'rb') as fd: md5obj = hashlib.md5() md5obj.update(fd.read()) hashv1 = md5obj.hexdigest() return hashv1 # sha1值 def JMSHA1(filete): sha1jiami = hashlib.sha1() try: a = open(fr'{filete}', 'rb') except: print('文件路径有误,请输入正确路径!') return 0 while True: b = a.read(128000) # 这里就是每次读文件放进内存的大小,小心溢出! sha1jiami.update(b) if not b: break a.close() jiamijieguo = sha1jiami.hexdigest() return jiamijieguo # sha224值 def CalcFileSha224(filete): with open(filete, "rb") as f: # sha224 sha224obj = hashlib.sha224() sha224obj.update(f.read()) hash_value_224 = sha224obj.hexdigest() return hash_value_224 # sha256值 def CalcFileSha256(filete): with open(filete, "rb") as f: sha256obj = hashlib.sha256() sha256obj.update(f.read()) hash_value = sha256obj.hexdigest() return hash_value # sha384值 def CalcFileSha384(filete): with open(filete, "rb") as f: # sha384 sha384obj = hashlib.sha384() sha384obj.update(f.read()) hash_value_384 = sha384obj.hexdigest() return hash_value_384 # sha512值 def CalcFileSha512(filete): with open(filete, "rb") as f: # sha512 sha512obj = hashlib.sha512() sha512obj.update(f.read()) hash_value_512 = sha512obj.hexdigest() return hash_value_512 # CRC值 def crc32(filete): block_size = 1024 * 1024 crc = 0 try: fd = open(filete, 'rb') while True: buffer = fd.read(block_size) if len(buffer) == 0: # EOF or file empty. return hashes fd.close() if sys.version_info[0] < 3 and crc < 0: crc += 2 ** 32 return crc # 返回的是十进制的值 crc = zlib.crc32(buffer, crc) except Exception as e: if sys.version_info[0] < 3: error = str(e) pass else: error = str(e) return 0, error ScrolledText_file.insert("end", f"************ ************\n{msg}\n\t\t ↓↓↓值转换完毕↓↓↓\nMD5值:\n{file(msg)}\n\nsha1值:\n{JMSHA1(msg)}\n\nsha224值:\n{CalcFileSha224(msg)}\n\nsha256值:\n{CalcFileSha256(msg)}\n\nsha384值:\n{CalcFileSha384(msg)}\n\nsha512值:\n{CalcFileSha512(msg)}\n\ncrc32值:\n{hex(crc32(msg))}\n************ ************\n\n") except: ScrolledText_file.insert("end", f"[转换失败!!!]\n----↓↓↓----\n{msg}\n----↑↑↑----\t \n\n") # 文本转换 def hash_s(): MD5 = ScrolledText.get(1.0, END).strip().replace("\n", "").encode() ScrolledText_file.delete(0.0, END) #MD5 md5obj = hashlib.md5() md5obj.update(MD5) hashv1 = md5obj.hexdigest() #sh1 SH1 = ScrolledText.get(1.0, END).strip() hash_sha1 = hashlib.sha1(SH1.encode('utf8')).hexdigest() # sha224 sha224obj = hashlib.sha224() sha224obj.update(MD5) hash_value_224 = sha224obj.hexdigest() #sha256 sha256obj = hashlib.sha256() sha256obj.update(MD5) hash_value = sha256obj.hexdigest() # sha384 sha384obj = hashlib.sha384() sha384obj.update(MD5) hash_value_384 = sha384obj.hexdigest() # sha512 sha512obj = hashlib.sha512() sha512obj.update(MD5) hash_value_512 = sha512obj.hexdigest() # blake2b blake2b = hashlib.blake2b() blake2b.update(MD5) hash_value_blake2b = blake2b.hexdigest() # blake2s blake2s = hashlib.blake2s() blake2s.update(MD5) hash_value_blake2s = blake2s.hexdigest() ScrolledText_file.insert("end", 'MD5值:' + hashv1+'\n\nsha1值:'+hash_sha1+'\n\nsha224值:'+hash_value_224+'\n\nsha256值:'+hash_value+'\n\nsha384值:'+hash_value_384+'\n\nsha512值:'+hash_value_512) ScrolledText_file.insert("end", '\n\nblake2b值:' + hash_value_blake2b+'\n\nblake2s值:' + hash_value_blake2s) windnd.hook_dropfiles(theLabel, func=file) # 背景 ScrolledText.insert("end", '输入要转换的文字字符串,输入之前别忘了清空!!') Button(root, text='hash转换',command=hash_s).place(x=170, y=184) root.mainloop()
以上就是使用Python计算文件和文本的多种Hash值的详细内容,更多关于Python计算Hash值的资料请关注脚本之家其它相关文章!