Действительно, если строки все разные по длине, то длину и взять.
Если возможны и одинаковые по длине строки, то добавить в хеш несколько символов из строки, позиции которых брать псевдослучайно (но строго детерминированно и всегда одинаково!). Для обычных сильно не совпадающих строк работать будет быстро (фактически
![$O(1)$ $O(1)$](https://dxdy-02.korotkov.co.uk/f/1/e/2/1e2f931ee6c0b8e7a51a7b0d123d514f82.png)
), для хорошо совпадающих - зависит от выбора позиций и тут уж без априорной статистики о самих строках не обойтись (например предъявив все
![$k^n$ $k^n$](https://dxdy-01.korotkov.co.uk/f/8/2/0/82047ead8321185e1e409b10d954393982.png)
возможных перестановок строк длины
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
из алфавитап в
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
символов мы собъём любой возможный хеш).
Взяв не фиксированное количество символов в хеш, а например
![$\log n$ $\log n$](https://dxdy-03.korotkov.co.uk/f/6/9/3/6931c25b0d6a07c96e4160eac934c79d82.png)
символов (в позициях с простыми индексами или даже с индексами
![$2^i, i \le n$ $2^i, i \le n$](https://dxdy-03.korotkov.co.uk/f/6/a/4/6a44a245a9b99db3260e28268530be0982.png)
) получим время
![$O(\log n)$ $O(\log n)$](https://dxdy-01.korotkov.co.uk/f/0/d/4/0d4b7f5b66e994af32a32cfa26868d5382.png)
. Тут для усложнения можно выбирать разные функции индексов в зависимости от значения
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
, на
![$O()$ $O()$](https://dxdy-02.korotkov.co.uk/f/5/7/1/57109ebfde23280f2407aa8d652df31782.png)
это уже не повлияет.
Саму функцию вычисления хеша взять какую-нибудь хорошо исследованную, с известными параметрами и свойствами.