[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