blob: 7df3e757b095612d6cf5e02cb773235a07aca414 [file] [log] [blame]
Brian Curtin5f6b4a52010-06-29 00:17:01 +00001from hashlib import md5
Guido van Rossum82268e01994-10-08 19:17:34 +00002import string
Andrew M. Kuchlingf64509e2003-04-24 17:26:56 +00003from sys import argv
Guido van Rossum82268e01994-10-08 19:17:34 +00004
5def MDPrint(str):
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +00006 outstr = ''
Brian Curtin5f6b4a52010-06-29 00:17:01 +00007 for o in str:
Tim Peterse6ddc8b2004-07-18 05:56:09 +00008 outstr = (outstr
9 + string.hexdigits[(o >> 4) & 0xF]
Andrew M. Kuchlinge81866e2003-04-24 17:27:53 +000010 + string.hexdigits[o & 0xF])
Collin Winter6f2df4d2007-07-17 20:59:35 +000011 print(outstr, end=' ')
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000012
Guido van Rossum82268e01994-10-08 19:17:34 +000013
14from time import time
15
16def makestr(start, end):
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000017 result = ''
18 for i in range(start, end + 1):
19 result = result + chr(i)
Guido van Rossum82268e01994-10-08 19:17:34 +000020
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000021 return result
22
Guido van Rossum82268e01994-10-08 19:17:34 +000023
Guido van Rossum82268e01994-10-08 19:17:34 +000024def MDTimeTrial():
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000025 TEST_BLOCK_SIZE = 1000
26 TEST_BLOCKS = 10000
Guido van Rossum82268e01994-10-08 19:17:34 +000027
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000028 TEST_BYTES = TEST_BLOCK_SIZE * TEST_BLOCKS
Guido van Rossum82268e01994-10-08 19:17:34 +000029
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000030 # initialize test data, need temporary string filler
Guido van Rossum82268e01994-10-08 19:17:34 +000031
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000032 filsiz = 1 << 8
33 filler = makestr(0, filsiz-1)
Benjamin Petersond7b03282008-09-13 15:58:53 +000034 data = filler * (TEST_BLOCK_SIZE // filsiz)
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000035 data = data + filler[:(TEST_BLOCK_SIZE % filsiz)]
36
37 del filsiz, filler
Guido van Rossum82268e01994-10-08 19:17:34 +000038
39
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000040 # start timer
Collin Winter6f2df4d2007-07-17 20:59:35 +000041 print('MD5 time trial. Processing', TEST_BYTES, 'characters...')
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000042 t1 = time()
Guido van Rossum82268e01994-10-08 19:17:34 +000043
Brian Curtin5f6b4a52010-06-29 00:17:01 +000044 mdContext = md5()
Guido van Rossum82268e01994-10-08 19:17:34 +000045
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000046 for i in range(TEST_BLOCKS):
47 mdContext.update(data)
Guido van Rossum82268e01994-10-08 19:17:34 +000048
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000049 str = mdContext.digest()
50 t2 = time()
Guido van Rossum82268e01994-10-08 19:17:34 +000051
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000052 MDPrint(str)
Collin Winter6f2df4d2007-07-17 20:59:35 +000053 print('is digest of test input.')
54 print('Seconds to process test input:', t2 - t1)
55 print('Characters processed per second:', TEST_BYTES / (t2 - t1))
Guido van Rossum82268e01994-10-08 19:17:34 +000056
57
58def MDString(str):
Brian Curtin5f6b4a52010-06-29 00:17:01 +000059 MDPrint(md5(str.encode("utf-8")).digest())
Collin Winter6f2df4d2007-07-17 20:59:35 +000060 print('"' + str + '"')
Guido van Rossum82268e01994-10-08 19:17:34 +000061
62
63def MDFile(filename):
Benjamin Petersond7b03282008-09-13 15:58:53 +000064 f = open(filename, 'rb')
Brian Curtin5f6b4a52010-06-29 00:17:01 +000065 mdContext = md5()
Guido van Rossum82268e01994-10-08 19:17:34 +000066
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000067 while 1:
68 data = f.read(1024)
69 if not data:
70 break
71 mdContext.update(data)
Guido van Rossum82268e01994-10-08 19:17:34 +000072
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000073 MDPrint(mdContext.digest())
Collin Winter6f2df4d2007-07-17 20:59:35 +000074 print(filename)
Guido van Rossum82268e01994-10-08 19:17:34 +000075
76
77import sys
78
79def MDFilter():
Brian Curtin5f6b4a52010-06-29 00:17:01 +000080 mdContext = md5()
Guido van Rossum82268e01994-10-08 19:17:34 +000081
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000082 while 1:
83 data = sys.stdin.read(16)
84 if not data:
85 break
86 mdContext.update(data)
Guido van Rossum82268e01994-10-08 19:17:34 +000087
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000088 MDPrint(mdContext.digest())
Collin Winter6f2df4d2007-07-17 20:59:35 +000089 print()
Guido van Rossum82268e01994-10-08 19:17:34 +000090
91
92def MDTestSuite():
Collin Winter6f2df4d2007-07-17 20:59:35 +000093 print('MD5 test suite results:')
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +000094 MDString('')
95 MDString('a')
96 MDString('abc')
97 MDString('message digest')
98 MDString(makestr(ord('a'), ord('z')))
Tim Peterse6ddc8b2004-07-18 05:56:09 +000099 MDString(makestr(ord('A'), ord('Z'))
100 + makestr(ord('a'), ord('z'))
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +0000101 + makestr(ord('0'), ord('9')))
102 MDString((makestr(ord('1'), ord('9')) + '0') * 8)
Guido van Rossum82268e01994-10-08 19:17:34 +0000103
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +0000104 # Contents of file foo are "abc"
105 MDFile('foo')
Guido van Rossum82268e01994-10-08 19:17:34 +0000106
107
Guido van Rossum82268e01994-10-08 19:17:34 +0000108# I don't wanna use getopt(), since I want to use the same i/f...
109def main():
Andrew M. Kuchling30dd9bc2003-04-24 17:26:22 +0000110 if len(argv) == 1:
111 MDFilter()
112 for arg in argv[1:]:
113 if arg[:2] == '-s':
114 MDString(arg[2:])
115 elif arg == '-t':
116 MDTimeTrial()
117 elif arg == '-x':
118 MDTestSuite()
119 else:
120 MDFile(arg)
Guido van Rossum82268e01994-10-08 19:17:34 +0000121
122main()