md5driver.py 2.46 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1
import string
2 3
import md5
from sys import argv
Guido van Rossum's avatar
Guido van Rossum committed
4 5

def MDPrint(str):
6 7 8
    outstr = ''
    for i in str:
        o = ord(i)
9 10
        outstr = (outstr
                  + string.hexdigits[(o >> 4) & 0xF]
11
                  + string.hexdigits[o & 0xF])
12 13
    print outstr,

Guido van Rossum's avatar
Guido van Rossum committed
14 15 16 17

from time import time

def makestr(start, end):
18 19 20 21 22
    result = ''
    for i in range(start, end + 1):
        result = result + chr(i)

    return result
Guido van Rossum's avatar
Guido van Rossum committed
23 24 25


def MDTimeTrial():
26 27 28 29
    TEST_BLOCK_SIZE = 1000
    TEST_BLOCKS = 10000

    TEST_BYTES = TEST_BLOCK_SIZE * TEST_BLOCKS
Guido van Rossum's avatar
Guido van Rossum committed
30

31
    # initialize test data, need temporary string filler
Guido van Rossum's avatar
Guido van Rossum committed
32

33 34 35 36
    filsiz = 1 << 8
    filler = makestr(0, filsiz-1)
    data = filler * (TEST_BLOCK_SIZE / filsiz);
    data = data + filler[:(TEST_BLOCK_SIZE % filsiz)]
Guido van Rossum's avatar
Guido van Rossum committed
37

38
    del filsiz, filler
Guido van Rossum's avatar
Guido van Rossum committed
39 40


41 42 43
    # start timer
    print 'MD5 time trial. Processing', TEST_BYTES, 'characters...'
    t1 = time()
Guido van Rossum's avatar
Guido van Rossum committed
44

45
    mdContext = md5.new()
Guido van Rossum's avatar
Guido van Rossum committed
46

47 48
    for i in range(TEST_BLOCKS):
        mdContext.update(data)
Guido van Rossum's avatar
Guido van Rossum committed
49

50 51
    str = mdContext.digest()
    t2 = time()
Guido van Rossum's avatar
Guido van Rossum committed
52

53 54 55 56
    MDPrint(str)
    print 'is digest of test input.'
    print 'Seconds to process test input:', t2 - t1
    print 'Characters processed per second:', TEST_BYTES / (t2 - t1)
Guido van Rossum's avatar
Guido van Rossum committed
57 58 59


def MDString(str):
60
    MDPrint(md5.new(str).digest())
61
    print '"' + str + '"'
Guido van Rossum's avatar
Guido van Rossum committed
62 63 64


def MDFile(filename):
65
    f = open(filename, 'rb');
66
    mdContext = md5.new()
Guido van Rossum's avatar
Guido van Rossum committed
67

68 69 70 71 72
    while 1:
        data = f.read(1024)
        if not data:
            break
        mdContext.update(data)
Guido van Rossum's avatar
Guido van Rossum committed
73

74 75
    MDPrint(mdContext.digest())
    print filename
Guido van Rossum's avatar
Guido van Rossum committed
76 77 78 79 80


import sys

def MDFilter():
81
    mdContext = md5.new()
Guido van Rossum's avatar
Guido van Rossum committed
82

83 84 85 86 87
    while 1:
        data = sys.stdin.read(16)
        if not data:
            break
        mdContext.update(data)
Guido van Rossum's avatar
Guido van Rossum committed
88

89 90
    MDPrint(mdContext.digest())
    print
Guido van Rossum's avatar
Guido van Rossum committed
91 92 93


def MDTestSuite():
94 95 96 97 98 99
    print 'MD5 test suite results:'
    MDString('')
    MDString('a')
    MDString('abc')
    MDString('message digest')
    MDString(makestr(ord('a'), ord('z')))
100 101
    MDString(makestr(ord('A'), ord('Z'))
              + makestr(ord('a'), ord('z'))
102 103
              + makestr(ord('0'), ord('9')))
    MDString((makestr(ord('1'), ord('9')) + '0') * 8)
Guido van Rossum's avatar
Guido van Rossum committed
104

105 106
    # Contents of file foo are "abc"
    MDFile('foo')
Guido van Rossum's avatar
Guido van Rossum committed
107 108 109 110


# I don't wanna use getopt(), since I want to use the same i/f...
def main():
111 112 113 114 115 116 117 118 119 120 121
    if len(argv) == 1:
        MDFilter()
    for arg in argv[1:]:
        if arg[:2] == '-s':
            MDString(arg[2:])
        elif arg == '-t':
            MDTimeTrial()
        elif arg == '-x':
            MDTestSuite()
        else:
            MDFile(arg)
Guido van Rossum's avatar
Guido van Rossum committed
122 123

main()