确定性地将ids映射到任意数量的工人

时间:2013-12-21 13:25:46

标签: python

我将基于字符串的id映射到16个worker。工人有一个基于十六进制数字的自己的id,所以0到f。映射使用可打印格式的md5的第一个字符(hexdigest)

我想让工人数量任意,而不是被迫使用16名工人。所以我需要一个散列函数来确定性地将id映射到worker。

1 个答案:

答案 0 :(得分:2)

只需将十六进制字符串转换为int并使用模数除法来获取正确的工作程序:

import struct
import hashlib
number_of_workers = 16
my_md5 = hashlib.md5('stackoverflow.com').hexdigest()
# my_md5 is 'd0cc85b26f2ceb8714b978e07def4f6e'

id = struct.unpack('>L', my_md5.decode('hex')[:4])[0]
# id is 3503064498L
# id % number_of_workers = 2
string_id = '%X' % (id % number_of_workers, )
# string_id = '2'

send_to_worker(string_id, task)

我取md5的前4个字节并将它们解释为整数。然后我使用模除法来确保我保持在工人ID的范围内,然后将其转换回字符串以将其转换为ID。