字符串hash分桶方法

  • Post author:
  • Post category:其他


利用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 版权协议,转载请附上原文出处链接和本声明。