[Checkins] SVN: z3c.datagenerator/trunk/ - Refined the seed generation further: zlib.crc32() in 32 bit Python can

Shane Hathaway shane at hathawaymix.org
Wed Dec 3 14:18:28 EST 2008


Log message for revision 93587:
  - Refined the seed generation further: zlib.crc32() in 32 bit Python can
    generate negative hashes, while 64 bit Python does not.  Enforced
    positive hashes.
  
  - Began a test suite.
  

Changed:
  U   z3c.datagenerator/trunk/CHANGES.txt
  U   z3c.datagenerator/trunk/setup.py
  U   z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt
  U   z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py
  U   z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py
  U   z3c.datagenerator/trunk/src/z3c/datagenerator/net.py

-=-
Modified: z3c.datagenerator/trunk/CHANGES.txt
===================================================================
--- z3c.datagenerator/trunk/CHANGES.txt	2008-12-03 18:47:00 UTC (rev 93586)
+++ z3c.datagenerator/trunk/CHANGES.txt	2008-12-03 19:18:28 UTC (rev 93587)
@@ -2,8 +2,19 @@
 CHANGES
 =======
 
+0.0.3 (2008-12-03)
+------------------
+
+- Refined the seed generation further: zlib.crc32() in 32 bit Python can
+  generate negative hashes, while 64 bit Python does not.  Enforced
+  positive hashes.
+
+- Began a test suite.
+
+
 0.0.2 (2008-12-02)
 ------------------
+
 - Use the crc32 function to hash random seeds so that the
   same random sequences are generated on both 32 bit and 64 bit
   builds of Python.

Modified: z3c.datagenerator/trunk/setup.py
===================================================================
--- z3c.datagenerator/trunk/setup.py	2008-12-03 18:47:00 UTC (rev 93586)
+++ z3c.datagenerator/trunk/setup.py	2008-12-03 19:18:28 UTC (rev 93587)
@@ -61,4 +61,5 @@
         'zope.schema',
         ],
     zip_safe = False,
+    test_suite = 'z3c.datagenerator.tests.test_doc.test_suite',
 )

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt	2008-12-03 18:47:00 UTC (rev 93586)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt	2008-12-03 19:18:28 UTC (rev 93587)
@@ -7,4 +7,15 @@
 to test your application with much more realistic data volumes and is
 considered for some development groups as essential as tests themselves.
 
+An essential part of this package is a consistent hash generator.  Verify
+its output.
 
+  >>> from z3c.datagenerator.generator import consistent_hash
+  >>> consistent_hash('seed')
+  1149756166
+  >>> consistent_hash('')
+  0
+  >>> consistent_hash('0')
+  4108050209
+
+(More tests needed, obviously.)

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py	2008-12-03 18:47:00 UTC (rev 93586)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py	2008-12-03 19:18:28 UTC (rev 93587)
@@ -18,7 +18,6 @@
 __docformat__ = "reStructuredText"
 import os
 import random
-from zlib import crc32
 import zope.interface
 
 from z3c.datagenerator import generator
@@ -41,7 +40,7 @@
     """A social security data generator."""
 
     def __init__(self, seed):
-        self.random = random.Random(crc32(seed+'ssn'))
+        self.random = random.Random(generator.consistent_hash(seed+'ssn'))
 
     def get(self):
         """Compute a social security number."""
@@ -64,7 +63,7 @@
     apts = True
 
     def __init__(self, seed):
-        self.random = random.Random(crc32(seed+'address'))
+        self.random = random.Random(generator.consistent_hash(seed+'address'))
         path = os.path.dirname(__file__)
 
         file = open(os.path.join(path, self.streetNamesFile), 'r')
@@ -111,7 +110,7 @@
     template = u'%i-%.3i-%.4i'
 
     def __init__(self, seed):
-        self.random = random.Random(crc32(seed+'ssn'))
+        self.random = random.Random(generator.consistent_hash(seed+'ssn'))
 
     def get(self):
         """Compute a social security number."""

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py	2008-12-03 18:47:00 UTC (rev 93586)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py	2008-12-03 19:18:28 UTC (rev 93587)
@@ -26,12 +26,18 @@
 from z3c.datagenerator import interfaces
 
 
+def consistent_hash(buf):
+    # Produce a hash of a string that behaves consistently in Python 32 and
+    # 64 bit.  The "& 0xffffffff" interprets negative numbers as positive.
+    return crc32(buf) & 0xffffffff
+
+
 class VocabularyDataGenerator(object):
     """Vocabulary-based data generator"""
     zope.interface.implements(interfaces.IDataGenerator)
 
     def __init__(self, seed, vocabulary):
-        self.random = random.Random(crc32(seed))
+        self.random = random.Random(consistent_hash(seed))
         self.vocabulary = vocabulary
 
     def get(self):
@@ -51,7 +57,7 @@
     path = os.path.dirname(__file__)
 
     def __init__(self, seed, filename):
-        self.random = random.Random(crc32(seed+filename))
+        self.random = random.Random(consistent_hash(seed+filename))
         self.values = self._read(filename)
 
     def get(self):
@@ -87,7 +93,7 @@
     zope.interface.implements(interfaces.IDateDataGenerator)
 
     def __init__(self, seed, start=None, end=None):
-        self.random = random.Random(crc32(seed+'ssn'))
+        self.random = random.Random(consistent_hash(seed+'ssn'))
         self.start = start or datetime.date(2000, 1, 1)
         self.end = end or datetime.date(2007, 1, 1)
 

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/net.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/net.py	2008-12-03 18:47:00 UTC (rev 93586)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/net.py	2008-12-03 19:18:28 UTC (rev 93587)
@@ -18,7 +18,6 @@
 __docformat__ = "reStructuredText"
 import os
 import random
-from zlib import crc32
 import zope.interface
 
 from z3c.datagenerator import demographics, generator, interfaces
@@ -29,7 +28,7 @@
     zope.interface.implements(interfaces.IDataGenerator)
 
     def __init__(self, seed):
-        self.random = random.Random(crc32(seed+'ip'))
+        self.random = random.Random(generator.consistent_hash(seed+'ip'))
 
     def get(self):
         """Select a value from the values list and return it."""
@@ -49,7 +48,7 @@
     pattern = u'%(firstInitial)s%(lastName)s'
 
     def __init__(self, seed):
-        self.random = random.Random(crc32(seed+'username'))
+        self.random = random.Random(generator.consistent_hash(seed+'username'))
         self.firstNames = demographics.FirstNameGenerator(seed)
         self.lastNames = demographics.LastNameGenerator(seed)
 
@@ -81,7 +80,7 @@
     pattern = '%(uname)s@%(domain)s%(tld)s'
 
     def __init__(self, seed):
-        self.random = random.Random(crc32(seed+'username'))
+        self.random = random.Random(generator.consistent_hash(seed+'username'))
         self.usernames = UsernameDataGenerator(seed)
         self.words = generator.TextDataGenerator(seed, self.wordsFile)
         self.tlds = generator.CSVDataGenerator(seed, self.tldsFile)



More information about the Checkins mailing list