/Demo/md5test/md5driver.py

http://unladen-swallow.googlecode.com/ · Python · 123 lines · 85 code · 34 blank · 4 comment · 13 complexity · 54214a415b60c3b18c90c5f8f949edc4 MD5 · raw file

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