------------------------
При выставлении похожей вакансии - роботадатели часто указывают в своем запросе к кадровому агентсту: РГГУ, МГУ, Бауманский:)
Бизнес здесь не при чем, это лишь особенности менталитета - возьмите, к примеру, Японцев которые больше предпочитают брать людей "с нуля" и готовить того кто им нужен.
Не очень поятно зачем вы используете (like % woman).
В случае если % стоит в начале строки индекс не учитывается и время выборки жестоко увеличивается.
Если среднее число слипаний 5, то алгоритм в ~5 раз медленнее если 2 то в ~2 раза медленнее. Не так уж и страшны коллизии.
Вот часть функции MD5, о которой шла речь
Round1(A, B, C, D, Data[ 0] + LongInt($d76aa478), 7);
Round1(D, A, B, C, Data[ 1] + LongInt($e8c7b756), 12);
Round1(C, D, A, B, Data[ 2] + LongInt($242070db), 17);
Round1(B, C, D, A, Data[ 3] + LongInt($c1bdceee), 22);
Round1(A, B, C, D, Data[ 4] + LongInt($f57c0faf), 7);
Round1(D, A, B, C, Data[ 5] + LongInt($4787c62a), 12);
Round1(C, D, A, B, Data[ 6] + LongInt($a8304613), 17);
Round1(B, C, D, A, Data[ 7] + LongInt($fd469501), 22);
Round1(A, B, C, D, Data[ 8] + LongInt($698098d8), 7);
Round1(D, A, B, C, Data[ 9] + LongInt($8b44f7af), 12);
Round1(C, D, A, B, Data[10] + LongInt($ffff5bb1), 17);
Round1(B, C, D, A, Data[11] + LongInt($895cd7be), 22);
Round1(A, B, C, D, Data[12] + LongInt($6b901122), 7);
Round1(D, A, B, C, Data[13] + LongInt($fd987193), 12);
Round1(C, D, A, B, Data[14] + LongInt($a679438e), 17);
Round1(B, C, D, A, Data[15] + LongInt($49b40821), 22);
Round2(A, B, C, D, Data[ 1] + LongInt($f61e2562), 5);
Round2(D, A, B, C, Data[ 6] + LongInt($c040b340), 9);
Round2(C, D, A, B, Data[11] + LongInt($265e5a51), 14);
Round2(B, C, D, A, Data[ 0] + LongInt($e9b6c7aa), 20);
Round2(A, B, C, D, Data[ 5] + LongInt($d62f105d), 5);
Round2(D, A, B, C, Data[10] + LongInt($02441453), 9);
Round2(C, D, A, B, Data[15] + LongInt($d8a1e681), 14);
Round2(B, C, D, A, Data[ 4] + LongInt($e7d3fbc8), 20);
Round2(A, B, C, D, Data[ 9] + LongInt($21e1cde6), 5);
Round2(D, A, B, C, Data[14] + LongInt($c33707d6), 9);
Round2(C, D, A, B, Data[ 3] + LongInt($f4d50d87), 14);
Round2(B, C, D, A, Data[ 8] + LongInt($455a14ed), 20);
Round2(A, B, C, D, Data[13] + LongInt($a9e3e905), 5);
Round2(D, A, B, C, Data[ 2] + LongInt($fcefa3f8), 9);
Round2(C, D, A, B, Data[ 7] + LongInt($676f02d9), 14);
Round2(B, C, D, A, Data[12] + LongInt($8d2a4c8a), 20);
Round3(A, B, C, D, Data[ 5] + LongInt($fffa3942), 4);
Round3(D, A, B, C, Data[ 8] + LongInt($8771f681), 11);
Round3(C, D, A, B, Data[11] + LongInt($6d9d6122), 16);
Round3(B, C, D, A, Data[14] + LongInt($fde5380c), 23);
Round3(A, B, C, D, Data[ 1] + LongInt($a4beea44), 4);
Round3(D, A, B, C, Data[ 4] + LongInt($4bdecfa9), 11);
Round3(C, D, A, B, Data[ 7] + LongInt($f6bb4b60), 16);
Round3(B, C, D, A, Data[10] + LongInt($bebfbc70), 23);
Round3(A, B, C, D, Data[13] + LongInt($289b7ec6), 4);
Round3(D, A, B, C, Data[ 0] + LongInt($eaa127fa), 11);
Round3(C, D, A, B, Data[ 3] + LongInt($d4ef3085), 16);
Round3(B, C, D, A, Data[ 6] + LongInt($04881d05), 23);
Round3(A, B, C, D, Data[ 9] + LongInt($d9d4d039), 4);
Round3(D, A, B, C, Data[12] + LongInt($e6db99e5), 11);
Round3(C, D, A, B, Data[15] + LongInt($1fa27cf8), 16);
Round3(B, C, D, A, Data[ 2] + LongInt($c4ac5665), 23);
Round4(A, B, C, D, Data[ 0] + LongInt($f4292244), 6);
Round4(D, A, B, C, Data[ 7] + LongInt($432aff97), 10);
Round4(C, D, A, B, Data[14] + LongInt($ab9423a7), 15);
Round4(B, C, D, A, Data[ 5] + LongInt($fc93a039), 21);
Round4(A, B, C, D, Data[12] + LongInt($655b59c3), 6);
Round4(D, A, B, C, Data[ 3] + LongInt($8f0ccc92), 10);
Round4(C, D, A, B, Data[10] + LongInt($ffeff47d), 15);
Round4(B, C, D, A, Data[ 1] + LongInt($85845dd1), 21);
Round4(A, B, C, D, Data[ 8] + LongInt($6fa87e4f), 6);
Round4(D, A, B, C, Data[15] + LongInt($fe2ce6e0), 10);
Round4(C, D, A, B, Data[ 6] + LongInt($a3014314), 15);
Round4(B, C, D, A, Data[13] + LongInt($4e0811a1), 21);
Round4(A, B, C, D, Data[ 4] + LongInt($f7537e82), 6);
Round4(D, A, B, C, Data[11] + LongInt($bd3af235), 10);
Round4(C, D, A, B, Data[ 2] + LongInt($2ad7d2bb), 15);
Round4(B, C, D, A, Data[ 9] + LongInt($eb86d391), 21);
Может есть смысл сделать функцию по проще?
И при этом разрешать N-слипаний?
Скажи человеку что на небе 8 567 122 433 звезды - он верит.
Скажи, что надо хэшировать выделенным N символам - то же верят (хотя это читая гипотеза).
А вот когда пишешь, что можно пытаться подобрать функцию - отвечают ИХМО....
При этом, спорить и доказывать ничего не собираются, ни какой конкретики и желания выявить истину.
Ясно☝
Пасиба
Ок. Допустим, таблица состовит из одних коллизий и все они имеют 8 слипаний остальные 53тыс. ячеек пусты?
Или, допустим, все что вся таблица с коллизиями т.е. где-то 2 слипания на каждое значение?
Ну и где тут помойка?
Сколько коллизий не считал, потому что сразу было ясно 100.000 слов в 65.535 позиций не влезут.
При выборе хэш-функции поступили просто - подобрали методом "научного" перебора. Получили MAX 8 слипаний на одну коллизию и успокоились - для 100 тысяч - норма. Правда при этом пришлось добавить процедуру сравнения входного слова со словарным и сам процесс разрешения коллизий. При всем при этом рассеивающая функция базировалась на отработки номеров н-грамм (те же слоги) из которых состояло слово.
На несловарных словоформах, аббревиатурах и.т.п получается чуть хуже, разобраться, что там на что влияет - это вопрос к математикам.
На больших объемах тестировать не стали - положили, что проще сделать 10 емкостей по 100 тысяч, чем делать все это 64 битным или 32 битным ключем т.к. по расчетам памяти при этом тратится несоизмеримо больше.
А может просто выписать все слова и пронумеровать?
P.S.
Максимум, что получалось в подборе хэш-функции:
для 16-битного хэширования 100 тыс. лемм -
(edit)MAX число слипаний в 1 коллизии 8.
А о каком размере ключа идет речь?