私は何度もこのサイトにアクセスし、質問への回答を見つけましたが、ついに私自身の質問を投稿する時が来ました! したがって、私のソフトウェアの特定のクラスの目的は、固定長のランダムなパスワードを生成することであり、「低」ASCII 文字で構成されています。主な問題は、同じパスワードを 2 回生成したくないが、常に一意であることを保証することです。最初に、これまでに生成した各パスワードをハッシュし、戻る前に新しいパスワードを作成するたびにチェックとして使用するために、 HashMapを使用しました。ただし、Java HashMap オブジェクトはサイズが制限されているため、最終的に Map が飽和しすぎて、許容可能な取得時間を維持できなくなります。以下は、問題に対する私の最新のクラックです。
package gen;
import java.util.Set;
import java.util.Random;
import java.util.HashSet;
public class Generator {
Random r;
int length;
Set<String> seen;
public Generator(int l){
seen = new HashSet<String>();
length = l;
r = new Random();
r.setSeed(System.currentTimeMillis());
}
public String generate(){
String retval = "";
int i = 0;
while(i<length){
int rand = r.nextInt(93)+33;
if(rand!=96){
retval+= (char)rand;
i++;
}
}
return retval;
}
public String generateNoRepeat(){
String retval;
int i;
do{
retval ="";
i = 0;
while(i<length){
int rand = r.nextInt(93)+33;
if(rand!=96){
retval+= (char)rand;
i++;
}
}
}while(!seen.add(retval));
return retval;
}
}
編集:セットの提案に感謝します。私のコードも今ではとてもきれいになります!
私は単にダムジェネレーターメソッドを使用してBlockingQueueを埋め、それをマルチスレッド化することにするかもしれません...
さらなる明確化: これは、安全なパスワードを生成するためのものではありません。最終的に可能なすべてのパスワードを生成し、指定された長さと文字セットに対して 1 回だけ生成することを単純に保証する必要があります。
ノート:
私は皆の意見を取り入れ、考えられるパスワードを順番に生成し、それらをディスクに保存することがおそらく最善の選択肢であるという結論に達しました。それか、単純にパスワードの重複を許可し、複数の Generator スレッドで非効率性を補います。