1import string 2import md5 3from sys import argv 4 5def MDPrint(str): 6 outstr = '' 7 for i in str: 8 o = ord(i) 9 outstr = (outstr 10 + string.hexdigits[(o >> 4) & 0xF] 11 + string.hexdigits[o & 0xF]) 12 print outstr, 13 14 15from time import time 16 17def makestr(start, end): 18 result = '' 19 for i in range(start, end + 1): 20 result = result + chr(i) 21 22 return result 23 24 25def MDTimeTrial(): 26 TEST_BLOCK_SIZE = 1000 27 TEST_BLOCKS = 10000 28 29 TEST_BYTES = TEST_BLOCK_SIZE * TEST_BLOCKS 30 31 # initialize test data, need temporary string filler 32 33 filsiz = 1 << 8 34 filler = makestr(0, filsiz-1) 35 data = filler * (TEST_BLOCK_SIZE // filsiz) 36 data = data + filler[:(TEST_BLOCK_SIZE % filsiz)] 37 38 del filsiz, filler 39 40 41 # start timer 42 print 'MD5 time trial. Processing', TEST_BYTES, 'characters...' 43 t1 = time() 44 45 mdContext = md5.new() 46 47 for i in range(TEST_BLOCKS): 48 mdContext.update(data) 49 50 str = mdContext.digest() 51 t2 = time() 52 53 MDPrint(str) 54 print 'is digest of test input.' 55 print 'Seconds to process test input:', t2 - t1 56 print 'Characters processed per second:', TEST_BYTES / (t2 - t1) 57 58 59def MDString(str): 60 MDPrint(md5.new(str).digest()) 61 print '"' + str + '"' 62 63 64def MDFile(filename): 65 f = open(filename, 'rb') 66 mdContext = md5.new() 67 68 while 1: 69 data = f.read(1024) 70 if not data: 71 break 72 mdContext.update(data) 73 74 MDPrint(mdContext.digest()) 75 print filename 76 77 78import sys 79 80def MDFilter(): 81 mdContext = md5.new() 82 83 while 1: 84 data = sys.stdin.read(16) 85 if not data: 86 break 87 mdContext.update(data) 88 89 MDPrint(mdContext.digest()) 90 print 91 92 93def MDTestSuite(): 94 print 'MD5 test suite results:' 95 MDString('') 96 MDString('a') 97 MDString('abc') 98 MDString('message digest') 99 MDString(makestr(ord('a'), ord('z'))) 100 MDString(makestr(ord('A'), ord('Z')) 101 + makestr(ord('a'), ord('z')) 102 + makestr(ord('0'), ord('9'))) 103 MDString((makestr(ord('1'), ord('9')) + '0') * 8) 104 105 # Contents of file foo are "abc" 106 MDFile('foo') 107 108 109# I don't wanna use getopt(), since I want to use the same i/f... 110def main(): 111 if len(argv) == 1: 112 MDFilter() 113 for arg in argv[1:]: 114 if arg[:2] == '-s': 115 MDString(arg[2:]) 116 elif arg == '-t': 117 MDTimeTrial() 118 elif arg == '-x': 119 MDTestSuite() 120 else: 121 MDFile(arg) 122 123main() 124