2013-03-08 9 views
7

Pracuję nad projektem, w którym muszę mieć zestaw ograniczeń haseł, które obejmują plik haseł niedozwolonych (Wszystkie popularne hasła, takie jak "abc", " abcdef "," 12345 "" hasło "itp.) Plik haseł będzie składać się z około 10000-15000 słów.Jak zapisać i wyszukać listę "Zablokowanych haseł"

Teraz chcę się upewnić, że gdy użytkownik ustawia/zmienia hasło, nie istnieje na liście. Myślałem o używaniu słownika (lub mapy) w Javie (z wiadrami jako "A", "B", "C" .... "Z", "NUMBERS", "SPECIAL_CHARS"), więc po prostu sprawdzam pierwszy znak, a następnie wyszukaj odpowiednie wiadro. Ale nie jestem pewien, jaki rodzaj wykonania mogę z tego wyciągnąć.

Wszelkie sugestie dotyczące pracy z listą zabronionych haseł ... Jakieś inne wskazówki, na które należy uważać?

Odpowiedz

2

Jeśli rozszerzysz podejście z "jednego wiadra na literę" do kompletnego ciągu znaków, zakończysz z trie, który wygląda na ładną strukturę tego problemu, chociaż nie widzę powodu, dla którego nie można użyć single HashSet (w końcu koszt weryfikacji jest niemal stały, a hash ustawia wyszukiwania w wiadrze, w którym hasło ma być przechowywane). Podział hasha w zależności od litery początkowej nie poprawia wydajności w porównaniu z użyciem pojedynczego zestawu. Z drugiej strony, jeśli implementacja jest ograniczona pamięcią, można uniknąć przechowywania niektórych zabronionych haseł i przeprowadzić weryfikację za pomocą reguł (np. Sprawdzić, czy występują 4 kolejne znaki różniące się o jeden, jak w "ghij", lub sprawdź, czy są to fragmenty wiersza klawiatury, na przykład "yuiop"). Każda reguła będzie odpowiednikiem kilku zabronionych haseł.

+0

To było moje pierwsze przypuszczenie, ale nie jestem pewien, czy trie będzie przesadzone, czy nie ... bardziej biorąc pod uwagę, że będę musiał przechowywać cały trie w pamięci. (Czy może czegoś brakuje?) – navinpai

+0

Przy pomocy tria można (teoretycznie) zaoszczędzić pamięć na podobne ciągi, takie jak 'password1' i' password2', które mają wspólny prefiks. Ale wtedy zdałem sobie sprawę, że każdy węzeł jest instancją i zawiera tablicę/listę dzieci ... i może wymagać więcej pamięci, jeśli masz wiele różnych prefiksów. Ponieważ modyfikacja hasła nie jest częstym zadaniem, myślę, że można wymieniać niektóre cykle procesora, aby zmniejszyć obciążenie pamięci. – Javier

0

Musisz napisać metodę, która może sprawdzić sekwencję znaków (np. Abcdef) i te same znaki (np. 111111) i wszystkie inne ograniczenia. Wraz z tym jak trzeba wziąć statyczną listę List/Set, która będzie przechowywać wszystkie ograniczone ciągi.

+0

Sekwencje i identyczne znaki są również częścią ograniczeń ... ale doszedłem do wniosku, że łatwiej będzie zająć się tymi z regexem niż zbieraniem ich ze słownikiem – navinpai

+0

To jest wt. Musisz manipulować tymi sekwencjami i tymi samymi ciągami znaków w metodzie za pomocą regx lub pętli. Tylko ty musisz przechowywać zastrzeżone ciągi wewnątrz tej statycznej listy jeden raz i sprawdzić używając metody() z listy(). – sanit

Powiązane problemy