2013-12-21 3 views
0

Я сопоставляю идентификаторы на основе строк для 16 работников. У рабочих есть свои идентификаторы на основе шестнадцатеричной цифры, поэтому от 0 до f. Отображение использует первый символ md5 в печатном формате (hexdigest)детерминированное отображение идентификаторов произвольному количеству работников

Я хотел бы сделать число рабочих произвольным, а не принудительно использовать 16 работников. Поэтому мне нужна хеширующая функция для определения идентификаторов для рабочих детерминистически.

+0

Возможно, я смущен, но как вы гарантируете, что первый символ md5 уникален для всех 16 работников? –

+0

использует шестнадцатеричный формат md5. Его можно печатать, например. 2424d1d1a665402b7c7cf80abef21dd0. Каждый символ является шестнадцатеричной цифрой, поэтому он ограничивает символы 0-9 и a-f – spatel

ответ

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) 

я беру первые 4 байта md5 и интерпретировать их как целое. Затем я использую модульное деление, чтобы убедиться, что я остаюсь в пределах рабочих идентификаторов, а затем преобразую его обратно в строку, чтобы превратить ее в идентификатор.

+0

Спасибо, это сработало! – spatel

Смежные вопросы