1

重複の可能性:
一意の英数字 10 文字の文字列の作成

一意のランダム パスワードを生成する必要があります。
だから私は何かをすることを考えMD5(counter+a_random_string+timeInMills)ましたが、これには32文字の出力があります。
8 文字のパスワードが必要です。ユニークなカスタム長の人間が読めるパスワード
を生成するにはどうすればよいですか?

更新:
毎回 N 個 (30 個未満) のパスワードを生成しますが、これらの N 個のパスワードは冗長でない必要があります。一意性の必要性は絶対的なものではありません。また、生成されたパスワードの繰り返し値をチェックして再生成すると、無限ループが発生する可能性があります

4

6 に答える 6

2

ここにアイデアがあります:java.util.UUIDクラスを使用してください。

UUID クラスは、疑似ランダムに生成された UUID を生成する静的ファクトリ メソッドを提供します。

UUID を文字列に変換できます。

一意性を保証したい場合は、UUID の値を切り捨てたり部分文字列にすることはできないことを忘れないでください。

MSDN の記事: GUID はグローバルに一意ですが、GUID の部分文字列はそうではありません

于 2012-12-13T18:55:46.687 に答える
2

大文字と小文字のアルファベット、数字、および 32 個の特殊文字 (合計 98 個) を想定すると、98 8 個の可能性または約 8.5x10 15個の可能性があります。最初にすべての可能性を使い果たすまで同じパスワードを 2 回生成しないという意味で「一意の」ランダム パスワードが必要な場合は、次の 2 つのオプションしかありません。

  1. パスワードをランダムに生成します。以前に生成されたすべてのパスワードを追跡し、衝突が発生した場合は、もう一度試してください... 泡立てて、すすぎ、繰り返します。
  2. 巡回擬似乱数ジェネレータを使用します。つまり、ランダムに見える値を選択することが保証されていますが、すべての値が使用されるまで繰り返されません。

2 番目のオプションは安全性が低くなります。誰かがアルゴリズムを決定すると、1 つのパスワードから次のパスワード (およびシーケンス全体) を予測できるからです。

于 2012-12-13T18:57:10.270 に答える
1

ランダムに生成された文字列の一意性を保証する力ずくの方法は、それらすべてを格納し、衝突時に再生成することです。

protected Collection<String> generatedPasswords = new HashSet<String>();
public String generatePassword(int length) {
  String password = null;
  do {
    StringBuilder buf = new StringBuilder();
    // Append "length" random password characters to "buf".
    password = buf.toString();
  } while (this.generatedPasswords.contains(password));
  return password;
}

ただし、エンドユーザー向けに「合理的に」ランダムなパスワードを生成しようとしていて、たまに発生する(非常にまれな)衝突に問題がない場合は、MD5スキームの最初のN文字を使用するだけで済みます。

于 2012-12-13T18:49:05.067 に答える
1

ランダム文字列/パスワード生成プログラムを 1 つ作成しました。これがあなたにも役立つことを願っています。

public class RandomStringGenerator{

    private static int randomStringLength = 25 ;
    private static boolean allowSpecialCharacters = true ;
    private static String specialCharacters = "!@$%*-_+:";
    private static boolean allowDuplicates = false ;

    private static boolean isAlphanum = false;
    private static boolean isNumeric = false;
    private static boolean isAlpha = false;
    private static final String alphabet = "abcdefghijklmnopqrstuvwxyz";
    private static boolean mixCase = false;
    private static final String capAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String num = "0123456789";

    public static String getRandomString() {
        String returnVal = "";
        int specialCharactersCount = 0;
        int maxspecialCharacters = randomStringLength/4;

        try {
            StringBuffer values = buildList();
            for (int inx = 0; inx < randomStringLength; inx++) {
                int selChar = (int) (Math.random() * (values.length() - 1));
                if (allowSpecialCharacters)
                {
                    if (specialCharacters.indexOf("" + values.charAt(selChar)) > -1)
                    {
                        specialCharactersCount ++;
                        if (specialCharactersCount > maxspecialCharacters)
                        {
                            while (specialCharacters.indexOf("" + values.charAt(selChar)) != -1)
                            {
                                selChar = (int) (Math.random() * (values.length() - 1));
                            }
                        }
                    }
                }
                returnVal += values.charAt(selChar);
                if (!allowDuplicates) {
                    values.deleteCharAt(selChar);
                }
            }
        } catch (Exception e) {
            returnVal = "Error While Processing Values";
        }
        return returnVal;
    }

    private static StringBuffer buildList() {
        StringBuffer list = new StringBuffer(0);
        if (isNumeric || isAlphanum) {
            list.append(num);
        }
        if (isAlpha || isAlphanum) {
            list.append(alphabet);
            if (mixCase) {
                list.append(capAlpha);
            }
        }
        if (allowSpecialCharacters)
        {
            list.append(specialCharacters);
        }
        int currLen = list.length();
        String returnVal = "";
        for (int inx = 0; inx < currLen; inx++) {
            int selChar = (int) (Math.random() * (list.length() - 1));
            returnVal += list.charAt(selChar);
            list.deleteCharAt(selChar);
        }
        list = new StringBuffer(returnVal);
        return list;
    }   

}
于 2012-12-13T18:57:05.450 に答える
0

任意の単純なアルゴリズムを使用してランダムな文字列を生成します (たとえば、これに対する解決策を参照してください: How do I create a random alpha-numeric string in C++? )。次に、セット(または一意性を保証できる他のデータ構造)を保持し、これらのランダムな文字列を挿入し続けることができます。必要な制限に達したら、セットを返すことができます。必要な文字列の数が非常に少ない (~50) ため、衝突の可能性も非常に小さいため、かなり効率的です。

于 2012-12-13T19:10:10.010 に答える
0

char 配列を作成し、ランダムな文字で埋めます。

Random r = new Random();
char[] pass = new char[8];
for (int i = 0; i < pass.length; ++i)
{
    pass[i] = r.nextInt(26) + 'a';
}
String passStr = new String(pass);
于 2012-12-13T18:40:28.913 に答える