#!/usr/bin/env python '''Try to guess some decent constants for our checksum class''' from __future__ import with_statement #mport os import sys import random import collections #mport primes_mod try: import rolling_checksum_pyx_mod as rolling_checksum_mod except ImportError: import rolling_checksum_py_mod as rolling_checksum_mod def my_range(up_to): '''A range that isn't limited by the size of an int''' value = 0 while value < up_to: yield value value += 1 def do_one(pickno, primes, len_primes): '''Pick some random constants and see if they work well''' # width can't be super big... Overwise things slow way down... width = primes[random.randint(0, 2000)] multiplicand = primes[random.randint(0, 10000)] # modulus shouldn't be super small, either modulus = primes[random.randint(50, 10000)] num_iterations = modulus * 4 addend = primes[random.randint(0, 10000)] rolling_checksum = rolling_checksum_mod.Rolling_checksum(width=width, multiplicand=multiplicand, modulus=modulus, addend=addend) result_dict = collections.defaultdict(int) for dummy in my_range(num_iterations): byte = random.randint(0, 255) rolling_checksum.add(byte) checksum = rolling_checksum.get_checksum() result_dict[checksum] += 1 len_result_dict = len(result_dict) print >> sys.stderr, 'pickno: %d, len_result_dict: %d, %% used: %.2f, width: %d, multiplicand: %d, modulus: %d, addend: %d' % ( pickno, len_result_dict, len_result_dict * 100.0 / modulus, width, multiplicand, modulus, addend, ) def main(): '''Main function - guess some constants that'll work reasonably well''' random.seed(3) print >> sys.stderr, 'reading list of primes...' with open('primes-below-100000000', 'r') as file_: primes = [ int(line) for line in file_ ] print >> sys.stderr, 'done reading, starting to evaluate constants' len_primes = len(primes) for pickno in my_range(1000000): do_one(pickno, primes, len_primes) main()