Python: исполнение по модулю на струнах
У меня есть несколько миллиардов строк в формате word0.word1.word2, и я хочу выполнить по модулю n этих строк, чтобы я мог передать каждую запись в базу данных для хранения. Я знаю, что могу выполнить форму по модулю 10 для первого символа строк следующим образом:
for i in ["a.b","c.d"]:
print ord(i[0]) % 10
Это не разделит мои строки равномерно, хотя word0, word1 и word2 отсортированы в алфавитном порядке, и первый символ строки очень часто "a". Я мог бы взять последнюю букву строки, но не уверен, нормально ли они распространяются или нет.
Мой вопрос: есть ли быстрый способ выполнить что-то вроде "ord" на всей строке? В конечном итоге я планирую запустить модуль 48 по целочисленным представлениям строк и хочу, чтобы этот модульный вывод был равномерно распределен по всем 48 ядрам. Я был бы благодарен за любую помощь, которую могут предложить другие.
1 ответ
s = "whatever" # have a string
h = hash(s) # obtain its hash
bin = h % 48 # find the bin
Обновление: встроенный в Python hash
Функция обеспечивает детерминированные значения только для одного процесса. Если вы хотите сохранить эту информацию (прямо или косвенно) в базе данных, вы должны использовать явную хэш-функцию, которая не содержит случайных данных. (Кредит идет на @Alik)