Add more tests of hash effectiveness.

This commit is contained in:
Raymond Hettinger 2015-08-09 00:35:00 -07:00
parent 7c4a6f8bd0
commit 455b5092a1
1 changed files with 24 additions and 0 deletions

View File

@ -10,6 +10,8 @@ import sys
import warnings
import collections
import collections.abc
import itertools
import string
class PassThru(Exception):
pass
@ -711,6 +713,28 @@ class TestFrozenSet(TestJointOps, unittest.TestCase):
addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
self.assertEqual(len(hashvalues), 2**n)
def letter_range(n):
return string.ascii_letters[:n]
def zf_range(n):
# https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers
nums = [frozenset()]
for i in range(n-1):
num = frozenset(nums)
nums.append(num)
return nums[:n]
def powerset(s):
for i in range(len(s)+1):
yield from map(frozenset, itertools.combinations(s, i))
for n in range(18):
t = 2 ** n
mask = t - 1
for nums in (range, letter_range, zf_range):
u = len({h & mask for h in map(hash, powerset(nums(n)))})
self.assertGreater(4*u, t)
class FrozenSetSubclass(frozenset):
pass