2013-03-08 22 views
7

Tôi đang làm việc trên một dự án mà tôi cần có một bộ hạn chế mật khẩu bao gồm tệp mật khẩu không được phép (Tất cả các mật khẩu thông dụng như 'abc', ' abcdef ',' 12345 '' mật khẩu ', v.v.) Tệp mật khẩu sẽ bao gồm khoảng 10000-15000 từ.Cách lưu trữ và tìm kiếm danh sách 'Mật khẩu bị cấm'

Bây giờ tôi muốn đảm bảo rằng khi người dùng đặt/thay đổi mật khẩu, mật khẩu không tồn tại trong danh sách. Tôi đã nghĩ đến việc sử dụng một từ điển (hoặc bản đồ) trong Java (với các nhóm như 'A', 'B', 'C' .... 'Z', 'NUMBERS', 'SPECIAL_CHARS') để tôi chỉ kiểm tra ký tự đầu tiên và sau đó tìm kiếm nhóm tương ứng. Nhưng tôi không chắc chắn về loại hiệu suất nào tôi có thể thoát khỏi điều này.

Bất kỳ đề xuất nào để làm việc với Danh sách 'Mật khẩu bị cấm' .... Bất kỳ gợi ý nào khác để xem ra?

Trả lời

2

Nếu bạn mở rộng phương pháp "một xô cho mỗi chữ cái" thành chuỗi hoàn chỉnh, bạn sẽ kết thúc bằng một trie, trông giống như một cấu trúc đẹp cho vấn đề này, mặc dù tôi không thể thấy lý do không sử dụng duy nhất HashSet (sau khi tất cả, chi phí xác minh là gần như không đổi, và tìm kiếm bộ băm trong thùng nơi mà mật khẩu được cho là được lưu trữ). Việc chia băm tùy thuộc vào chữ cái ban đầu không cải thiện hiệu suất so với việc sử dụng một bộ duy nhất. Mặt khác, nếu việc triển khai của bạn là bộ nhớ bị chặn, bạn có thể tránh lưu trữ một số mật khẩu bị cấm và thực hiện xác minh quy tắc (ví dụ: kiểm tra xem có 4 ký tự liên tiếp khác nhau không, như trong "ghij", hoặc kiểm tra xem chúng là những mảnh của hàng bàn phím, chẳng hạn như "yuiop"). Mỗi quy tắc sẽ tương đương với một số mật khẩu bị cấm.

+0

Đó là phỏng đoán đầu tiên của tôi, nhưng tôi không chắc liệu một trie sẽ quá mức cần thiết cho việc này hay không ... nhiều hơn nên xem xét tôi sẽ lưu toàn bộ bộ nhớ trong bộ nhớ. (Hoặc tôi đang thiếu một cái gì đó?) – navinpai

+0

Với một trie bạn có thể (trong lý thuyết) tiết kiệm bộ nhớ cho các chuỗi tương tự như 'password1' và' password2' có chung một tiền tố. Nhưng sau đó tôi nhận ra rằng mỗi nút là một thể hiện, và nó chứa một mảng/danh sách các childrens ... một nó có thể yêu cầu bộ nhớ nhiều hơn nếu bạn có nhiều tiền tố khác nhau. Vì sửa đổi mật khẩu không phải là một nhiệm vụ rất thường xuyên, tôi nghĩ rằng bạn có thể trao đổi một số chu kỳ bộ vi xử lý cho chi phí ít bộ nhớ hơn. – Javier

0

bạn phải viết một phương pháp có thể kiểm tra chuỗi ký tự (Ví dụ: abcdef) và các ký tự giống nhau (Ví dụ: 111111) và tất cả các ràng buộc khác. Cùng với bất kỳ cách nào bạn phải thực hiện một biến List/Set tĩnh sẽ giữ tất cả các chuỗi bị hạn chế.

+0

trình tự và các ký tự giống hệt nhau cũng là một phần của các hạn chế ... nhưng tôi cho rằng sẽ dễ dàng hơn để giải quyết những người có regex thay vì gộp chúng bằng từ điển – navinpai

+0

Đó là tôi đang nói. Bạn phải xử lý các sequesnces và các chuỗi ký tự giống nhau trong một phương thức bằng cách sử dụng regx hoặc looping. Chỉ có bạn phải lưu trữ các chuỗi bị hạn chế bên trong danh sách tĩnh đó một lần và kiểm tra bằng phương thức contains() của danh sách. – sanit

Các vấn đề liên quan