Я использовал схему, вдохновленную Годелем:
Назначьте простые буквы от P_1 до P_26 (в любом порядке, но для получения небольших хэш-значений лучше всего давать обычные буквы небольшими простыми числами).
Построена гистограмма букв в слове.
Тогда значение хеш-функции является произведением каждого простого числа, связанного с буквой, возведенного в степень его частоты. Это дает уникальное значение для каждой анаграммы.
Код Python:
primes = [2, 41, 37, 47, 3, 67, 71, 23, 5, 101, 61, 17, 19, 13, 31, 43, 97, 29, 11, 7, 73, 83, 79, 89, 59, 53]
def get_frequency_map(word):
map = {}
for letter in word:
map[letter] = map.get(letter, 0) + 1
return map
def hash(word):
map = get_frequency_map(word)
product = 1
for letter in map.iterkeys():
product = product * primes[ord(letter)-97] ** map.get(letter, 0)
return product
Это умно превращает сложную задачу поиска поданаграмм в (также известную как сложную) задачу факторизации больших чисел ...