Java 如何存储和搜索';禁用密码';

Java 如何存储和搜索';禁用密码';,java,dictionary,passwords,Java,Dictionary,Passwords,我正在从事一个项目,我需要有一套密码限制,其中包括一个不允许使用的密码文件(所有常见的密码,如“abc”、“abcdef”、“12345”“password”等)。密码文件将由大约10000-15000个字组成 现在我想确保当用户设置/更改密码时,列表中不存在该密码。我正在考虑使用Java中的字典(或映射)(bucket为'a','B','C','Z','NUMBERS','SPECIAL_CHARS'),这样我只需检查第一个字符,然后搜索相应的bucket。但我不确定我能从中得到什么样的表现

我正在从事一个项目,我需要有一套密码限制,其中包括一个不允许使用的密码文件(所有常见的密码,如“abc”、“abcdef”、“12345”“password”等)。密码文件将由大约10000-15000个字组成

现在我想确保当用户设置/更改密码时,列表中不存在该密码。我正在考虑使用Java中的字典(或映射)(bucket为'a','B','C','Z','NUMBERS','SPECIAL_CHARS'),这样我只需检查第一个字符,然后搜索相应的bucket。但我不确定我能从中得到什么样的表现


关于使用“禁用密码”列表的任何建议。。。。还有其他需要注意的指针吗?

如果您将“每个字母一个bucket”的方法扩展到完整的字符串,您将以a结尾,这看起来是解决此问题的一个很好的结构,尽管我看不出不使用单个
哈希集的原因(毕竟,验证成本几乎是恒定的,散列集在应该存储密码的bucket中搜索)。与使用单个散列集相比,根据初始字母拆分散列不会提高性能


另一方面,如果您的实现是内存受限的,则可以避免存储一些禁止的密码,并执行规则引导的验证(例如,检查是否有4个连续字符相差1,如“ghij”,或检查它们是否是键盘行的片段,如“yuiop”)。每个规则将相当于几个被禁止的密码。

您必须编写一个方法,该方法可以检查字符序列(Ex:abcdef)和相同字符序列(Ex:111111)以及所有其他约束条件。除此之外,您还必须获取一个静态列表/设置变量,该变量将保存所有受限制的字符串。

您可能希望使用一个真正的库来完成此操作。例如..

这是我的第一个猜测,但我不确定trie是否会对此过度使用…考虑到我必须存储整个字符串记忆中的trie(或者我遗漏了什么?)有了trie,你(理论上)可以为类似的字符串节省内存,例如共享一个共同前缀的
password1
password2
。但后来我意识到每个节点都是一个实例,它包含一个数组/子节点列表…如果有许多不同的前缀,可能需要更多内存。由于修改密码不是一项非常频繁的任务,我认为nk表示,你可以交换一些处理器周期以减少内存开销。序列和相同字符也是限制的一部分……但我认为用正则表达式处理这些问题比用字典将它们聚在一起更容易。我说的是wt。你必须在meth中处理这些序列和相同的字符串只需在静态列表中存储一次受限字符串,并使用列表的contains()方法进行检查。