Я бы выбрал простую (и дешевую) хеш-функцию f
, которую вы выбираете из семейства f0, f1, ...
таких функций, которые, например, отображаются на значения 0..255
.Если ваша хеш-функция была бы случайной, по парадоксу дня рождения у вас возникли бы коллизии для интересующих вас значений, но не для многих.
Теперь простой скрипт на Perl (любого типа) позволит вамПредварительная обработка данных с фиксированным значением для уменьшения (или даже устранения) коллизий путем выбора соответствующей функции из вашего набора.
Преимущество этого подхода состоит в том, что вы можете возобновить прогон предварительной обработки, если обнаружите, что вы забыли значение (как вы уже сделали) или какая-то странная страна решает отобразить странные символы юникода, такие как €, в 8-битный набор символов.
И, кстати, я думаю количество специальных символов, которые есть в некоторых iso-8859-?Наборы должны быть намного больше, чем у вас, здесь нет?Я бы взял их всех.
Редактировать: После некоторых экспериментов небольшой скрипт на Perl сообщает мне, что все 577 кодовых точек юникода, которые появляются в одной из кодировок iso-8859, отображаются на разныепозиции при уменьшении по модулю 10007 или 10009.
Редактировать: Следующая таблица делает трюк, для ограниченного набора:
wchar_t const uniqTable[91] = {
[0x7] = L'\u2116' /* № */,
[0xD] = L'\uFFFD' /* � */,
[0xE] = L'\u200C' /* */,
[0xF] = L'\u200D' /* */,
[0x10] = L'\u200E' /* */,
[0x11] = L'\u200F' /* */,
[0x13] = L'\u2122' /* ™ */,
[0x15] = L'\u2013' /* – */,
[0x16] = L'\u2014' /* — */,
[0x17] = L'\u2015' /* ― */,
[0x19] = L'\u2017' /* ‗ */,
[0x1A] = L'\u2018' /* ‘ */,
[0x1B] = L'\u2019' /* ’ */,
[0x1C] = L'\u201A' /* ‚ */,
[0x1E] = L'\u201C' /* “ */,
[0x1F] = L'\u201D' /* ” */,
[0x20] = L'\u201E' /* „ */,
[0x22] = L'\u2020' /* † */,
[0x23] = L'\u2021' /* ‡ */,
[0x24] = L'\u2022' /* • */,
[0x28] = L'\u2026' /* … */,
[0x32] = L'\u2030' /* ‰ */,
[0x3B] = L'\u2039' /* ‹ */,
[0x3C] = L'\u203A' /* › */,
[0x51] = L'\u20AA' /* ₪ */,
[0x52] = L'\u20AB' /* ₫ */,
[0x53] = L'\u20AC' /* € */,
[0x56] = L'\u20AF' /* ₯ */,
};