Вы ищете каждое слово или каждое слово в словаре английского языка? Используете ли вы стандартные слова - то есть из Оксфордского словаря английского языка или сленговые слова тоже включены? Я думаю, что я получаю: "Насколько велик ваш словарь"? Вы можете использовать MD5-хеш, который теоретически имеет вероятность коллизий - хотя 1 из миллиардов хешей, которые могут столкнуться - хотя, я не могу сказать, что я понял бы цель использования хеша вместо использования фактического слова. Если, возможно, вы не хотите вычислить сторону последовательного клиента так, чтобы он ссылался на правильный элемент словаря на стороне сервера, не анализируя словарь в поисках его последовательного. Конечно, очевидно, что слово должно быть достаточно уникальным, чтобы мы могли понимать его как людей, и мы гораздо эффективнее разбираем значение слов, чем компьютер делает то же самое.
Вы ищете отдельные слова, которые выглядят одинаково, но произносятся по-разному? Слова, которые выглядят и звучат одинаково, но имеют разные значения? Если это так, то вы откроетесь с хешем, так как одно и то же написание с другой семантикой создаст тот же хеш, поэтому он не будет работать для этого сценария. В этом случае вам понадобится какая-то инкрементная система. Если вы добавите слова после факта в словарь, будут ли они добавлены в конце и будут заданы следующий серийный номер по порядку? Что если это слово написано так же, как другое слово, но звучит по-другому или звучит одинаково, но имеет другую семантику? Что тогда?
Я полагаю, что от цели сериализации зависит, какой выход будет наиболее подходящим для вашего серийного номера и, следовательно, какой алгоритм будет наиболее эффективным.
Наиболее эффективный алгоритм, вероятно, будет разделять ваш словарь на такое же количество блоков, как у вас процессоров, и иметь поток на каждом процессоре, который сериализует слова в своем блоке, рекомбинируя выходные данные из каждого потока в конце. Это (теоретически) будет работать на скорости, немного меньшей, чем O (n / число процессоров), в реальной производительности, однако я думаю, что для математической корректности это все еще O (n), потому что вам все равно придется анализировать весь словарь один раз для сериализации каждое слово.
Я думаю, что самый безопасный путь:
- Беспокойся о том, что у тебя есть сейчас
- Упорядочить их в наиболее логичной последовательности (в алфавитном порядке?)
- Пронумеруйте их в последовательности
- Добавить новые слова (написанные одинаково или нет и имеющие разную семантику) в конце; дайте им следующий номер в последовательности, независимо от их законного места в словаре в алфавитном порядке.
Таким образом, вам не нужно беспокоиться о том, чтобы оставлять пробелы в серийных номерах для учета вставок между словами, вам не нужно беспокоиться о переиндексации любых зависимых данных для учета изменений в индексах при вставке слов. просто продолжай как обычно. Вам не нужно беспокоиться о коллизиях, и вы по-прежнему получаете наиболее эффективный механизм индексации для целей хранения, то есть вы не храните хеши MD5, которые потенциально длиннее исходного слова - что не имеет смысла для реального использования.
Если вам нужен доступ к словарю в алфавитном порядке, просто сортируйте по слову, в противном случае - нет.
Я все еще думаю, что я в растерянности относительно необходимости сериализации слова - за исключением целей хранения, где вы можете хранить свой словарь и таблицы ссылок по ключу слова.