我有一个字符数组,如下所示:
char[] pwdCharArray = "abcdefghijklmnopqrstuvwxyzABCDEFG" +
"HIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<" +
".>/?".ToCharArray();
从这个char数组中,我想生成一个最小长度为7的字符串,字符串中的所有字符都应该来自上面的char数组。 怎么做这个操作?
答案 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() + ")");
}
}
}