First little Python project, a little utility to take the MD5 and SHA hashes of a bunch of files dragged and dropped onto it. Same function as but better presentation that a Win32 version (on the Windows page) I wrote back in late '00 (and which I have still been making regular use of for checking MD5s of file downloads).
WxPython UI
This one is neater than the Win32 version since I can use the nifty HTML window widget and place the results for each new batch of files in a table, with the files and hashes cross-indexed. Simply cut, paste and save the text of the section below as drophash.py.
#!/usr/bin/env python # -*- coding: ISO-8859-1 -*- #MD5 test suite: #MD5 ("") = d41d8cd98f00b204e9800998ecf8427e #MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 #MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 #MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 #MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b #MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f #MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a #SHA test suite: #SHA ("abc") = A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D #SHA ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 #SHA (A million repetitions of "a") = 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F import wx import wx.html as html from md5 import * from sha import * def getHash(file, hashOp, delimiter) : try : reader = open(file, 'rb') except : return "" try : digest = hashOp() while True : chunk = reader.read(1024) if not chunk : break digest.update(chunk) finally: reader.close() raw = digest.hexdigest() work = [] i = 0 while i < len(raw) : work.append(raw[i]) i += 1 if 0 == (i%8) : work = work + delimiter return ''.join(work) class FileDropTarget(wx.FileDropTarget): def __init__(self, window): wx.FileDropTarget.__init__(self) self.window = window hashes = (md5, sha) nbsp = list(" ") def OnDropFiles(self, x, y, filenames) : self.window.AppendToPage("<table border=1><tr><th>File</th><th>MD5</th><th>SHA-1</th></tr>") for file in filenames : self.window.AppendToPage("<tr><td>%s</td>" % file) for hashOp in self.hashes : anHash = getHash(file, hashOp, self.nbsp) self.window.AppendToPage("<td><pre>%s</pre></td>" % anHash) self.window.AppendToPage("</tr>") self.window.AppendToPage("</table>") def decorate(frame): frame.SetTitle("wxPython - Drophash") ## optionally, an icon ## _icon = wx.EmptyIcon() ## _icon.CopyFromBitmap(wx.Bitmap("drophash.ico", wx.BITMAP_TYPE_ANY)) ## frame.SetIcon(_icon) frame.style = wx.DEFAULT_FRAME_STYLE pane = html.HtmlWindow(frame, -1) dt = FileDropTarget(pane) pane.SetDropTarget(dt) if __name__ == "__main__": theApp = wx.App(False) frame = wx.Frame(None, -1) decorate(frame) theApp.SetTopWindow(frame) frame.Show() theApp.MainLoop()
Python + Tk UI
As an alternative, a pure Tk version. Not so fancy; you have to select the files you want (or put them on the command line). Just extract this section as tkhash.py and double click…
#!/usr/bin/env python # -*- coding: ISO-8859-1 -*- #MD5 test suite: #MD5 ("") = d41d8cd98f00b204e9800998ecf8427e #MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 #MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 #MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 #MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b #MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f #MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a #SHA test suite: #SHA ("abc") = A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D #SHA ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 #SHA (A million repetitions of "a") = 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F import Tkinter import ScrolledText import tkFileDialog import sys import tkFont from md5 import * from sha import * hashes = {"MD5" : md5, "SHA" : sha} nbsp = list(" ") def getHash(file, hashOp, delimiter) : try : reader = open(file, 'rb') except : return "" try : digest = hashOp() while True : chunk = reader.read(1024) if not chunk : break digest.update(chunk) finally: reader.close() raw = digest.hexdigest() work = [] i = 0 while i < len(raw) : work.append(raw[i]) i += 1 if 0 == (i%8) : work = work + delimiter return ''.join(work) def doGetHashes() : filenames = tkFileDialog.askopenfilenames() updateCanvas(filenames) def updateCanvas(filenames): textarea.config(state=Tkinter.NORMAL) for file in filenames : textarea.insert(Tkinter.END, ("%s\n" % file)) for hashOp in hashes : anHash = getHash(file, hashes[hashOp], nbsp) textarea.insert(Tkinter.END, ("%s " % hashOp) ) textarea.insert(Tkinter.END, ("%s\n" % anHash), 'mono' ) textarea.insert(Tkinter.END, "-------------------------\n") textarea.tag_config('mono', font='courier') textarea.config(state=Tkinter.DISABLED) if __name__ == "__main__": root = Tkinter.Tk() root.title("tkFileHasher") textarea = ScrolledText.ScrolledText() textarea.pack() textarea.config(state=Tkinter.DISABLED) Tkinter.Button(text="Select files to hash...", command=doGetHashes).pack() updateCanvas(sys.argv[1:]) Tkinter.mainloop()