Pewnego popołudnia przeczytałem artykuł o tęczowych tabelach i pod jego wpływem zacząłem kombinować jak zrobić coś takiego ale swojego.

Do bazy wrzuciłem cały słownik z aspell’a dla języka polskiego (słowa z ogonkami i bez), angielskiego, kilka słowników z popularnymi hasłami, długą listę haseł z yourock i kilka innych. Sporo się nakombinowałem aby wygenerować dużo kombinacji szczególnie pod kątem polskich haseł (wszystkie: misiaczki, dupeczki, itp…) razem z różnymi popularnymi modyfikacjami (typu: misiaczki1, DUPECZKI, etc…). Na tym etapie miałem już wystarczająco dużo haseł aby bawić się dalej.

Zacząłem kombinować z różnymi długościami łańcuchów - niestety funkcja redukująca zmniejszała nieco entropię kolejnych hashy w łańcuchu, co dla długich łańcuchów mocno zmniejszało wydajność przeszukiwania bazy. Ostatecznie postawiłem na bardzo krótkie łańcuchy (a nuż się coś tafi a przynajmniej nie będzie mocno opuźniać wyszukiwań).

Obecnie baza ma ponad 200 milionów haseł i dla nich wygenerowane łańcuchy o długości 10 ogniw. Co daje teoretycznie możliwość sprawdzenia ok 2 miliardów hashy. Wydaje się to sporo ale w stosunku do innych baz dostępnych w sieci jest to kropla w morzu. A co do innych baz… pomyślałem, że skoro ktoś już zrobił taką bazę dobrze to można by to wykorzystać. I tak dorzuciłem funkcję “obsysania” innych bazy hashy w przypadku gdy moja danego hasha nie potrafi rozpoznać. Taki zabieg (którego implementacja zajęła mi 1 popołudnie) wdrożony dla kilku różnych wyszukiwarek znacznie poprawił efektywność rozpoznawania haseł.

Bazę postanowiłem udostępnić w postaci strony www - jak na razie ze stosunkowo liberalnymi zasadami korzystania (czyli bez ograniczeń na liczbę wyszukiwań, konieczności rejestracji itp).

Z bazy można korzystać pod poniższym linkiem: RainbowDB

Wyłączyłem tą stronkę po dobrych dwóch/trzech latach działania - ruch jest przekierowany na nowy projekt Hybrid Rainbow DB , w którym oprócz tęczowych tablic zaimplementowałem hybrydową tęczową tablicę - nowa aplikacja sprawdza o wiele więcej haseł.