利用hashlib的md5算法作为分桶基数,md5的字符串位数长度是固定的,这样很方便进行下一步的输出再分桶操作:
import random import string import hashlib from operator import add from functools import reduce from collections import defaultdict def md5(key): return hashlib.md5(key.encode()).hexdigest() def mapping(hashkey, n=10): return reduce(add, [ord(i) for i in hashkey]) % n 以下进行测试:
data = defaultdict(lambda: 0) def random_string_generator(): data = [] random_length = random.randint(1, 100) for i in range(random_length): x = random.choice(string.ascii_lowercase + string.digits + ' ') data.append(x) return ''.join(data) for i in range(100000): s = random_string_generator() c = mapping(md5(s)) print(f'"{s}" mapping to bukket {c}') data[c] += 1 print(data)
初步看来随机生成的各种各样的字符串最终分桶基本上是均匀的。虽然我知道md5算法是能够保证每个位数上的随机,但进行ord处理得到数字,相加再取模,是否也是保证均匀性的,我只能说这是猜的,需要严格的数学证明。
版权声明:本文为zcc_0015原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。