从退出的字符生成字符串

时间:2010-09-28 07:36:27

标签: c# java

我有一个字符数组,如下所示:

char[] pwdCharArray = "abcdefghijklmnopqrstuvwxyzABCDEFG" +
            "HIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<" + 
            ".>/?".ToCharArray();

从这个char数组中,我想生成一个最小长度为7的字符串,字符串中的所有字符都应该来自上面的char数组。 怎么做这个操作?

4 个答案:

答案 0 :(得分:3)

最大长度是多少? (您可能希望参数化下面的方法以指定最小和最大长度。)这是一个简单的方法,可以完成7个字符:

这是C#版本:

public string GeneratePassword(Random rng)
{
    char[] chars = new char[7];
    for (int i = 0; i < chars.Length; i++)
    {
        chars[i] = pwdCharArray[rng.Next(pwdCharArray.Length)];
    }
    return new string(chars);
}

请注意,应传入Random实例以避免创建Random的许多实例的常见问题。我有一个article来描述这个问题及其解决方法。实质上,您应该为每个线程使用一个Random实例 - 每次要使用一个实例时都不要创建新实例,并且不要在多个线程中重用相同的实例。

事实上,对于保护敏感信息的真实密码,您可能根本不应该使用Random,而是使用RNGCryptoServiceProvider(或更不直接地使用RandomNumberGenerator.Create()的结果3}})。这可能有点难以使用,但会为您提供更安全的随机数。

在Java中它会非常相似,但后来我会使用SecureRandom(幸运的是它比.NET版本更容易使用)。在这种情况下,每次都可以创建一个新实例:

public String generatePassword() {
    char[] chars = new char[7];
    SecureRandom rng = new SecureRandom();
    for (int i = 0; i < chars.length; i++) {
        chars[i] = pwdCharArray[nextInt(pwdCharArray.length)];
    }
    return new String(chars);
}

答案 1 :(得分:1)

(C#示例)

Random rand = new Random();
char[] arr = new char[rand.Next(7,15)];
for(int i = 0 ; i < arr.Length ; i++) {
    arr[i] = pwdCharArray[rand.Next(pwdCharArray.Length)];
}
string pwd = new string(arr);

答案 2 :(得分:1)

在0和yourArray.length -1之间生成7个随机数。 选择数组中相应的char并将其放在最终的String中。

以下是使用StringBuilder的代码:

StringBuilder sb = new StringBuilder();
Random random = new Randdom();
for(int i=0; i<7; i++) {
    sb.append(pwdCharArray[random.nextInt(0, pwdCharArray.length -1)]);
}
return sb.toString();

答案 3 :(得分:0)

这是Java中的一个解决方案,具有可变长度的单词,以及工作测试:

import java.util.*;

public class RandomWord {

    // Valid characters
    private static String VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFG" +
            "HIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<.>/?";

    // Minimal length thw word can have
    private static int MIN_LENGTH = 7;
    // Maximal length will be MIN_LENGTH + THRESHOLD - 1
    private static int THRESHOLD = 10;

    // Generate a random number generator.
    // The time in millis is used as seed prevents the numbers to be always the same in same order
    Random randomGenerator =  new Random(System.currentTimeMillis());

    public String generateWord () {
        // Actual length of the word (from MIN_LENGTH to MIN_LENGTH + THRESHOLD - 1)
        int length = MIN_LENGTH + randomGenerator.nextInt(THRESHOLD);
        // Loop for every character
        StringBuilder word = new StringBuilder();
        for (int i = 0; i < length; i++) {
            // Appends one more random char
            word.append(VALID_CHARACTERS.charAt(randomGenerator.nextInt(VALID_CHARACTERS.length())));
        }
        // Returns the random word
        return word.toString();
    }

    // Test the class
    public static void main (String[] args) {
        // Instantiates and tests the class
        RandomWord randomWord = new RandomWord();
        for (int i = 0; i < 30; i++) {
            String word = randomWord.generateWord();
            System.out.println(word + " (" + word.length() + ")");
        }
    }
}