我正在尝试生成一个 16 个字符的随机字符串,其中没有重复的字符。我认为这不应该太难,但我被困住了。
我正在使用 2 种方法,一种用于生成 key ,另一种用于删除重复的字符。在 main 中,我创建了一个 while 循环以确保生成的字符串长度为 16 个字符。
我的逻辑有问题,因为它只生成了 16 个字符的字符串 有重复项。就是做不对。
代码:
public string RemoveDuplicates(string s)
{
string newString = string.Empty;
List<char> found = new List<char>();
foreach (char c in s)
{
if (found.Contains(c))
continue;
newString += c.ToString();
found.Add(c);
}
return newString;
}
public static string GetUniqueKey(int maxSize)
{
char[] chars = new char[62];
chars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
byte[] data = new byte[1];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data);
data = new byte[maxSize];
crypto.GetNonZeroBytes(data);
StringBuilder result = new StringBuilder(maxSize);
foreach (byte b in data)
{
result.Append(chars[b % (chars.Length)]);
}
return result.ToString();
}
string builder = "";
do
{
builder = GetUniqueKey(16);
RemoveDuplicates(builder);
lblDir.Text = builder;
Application.DoEvents();
} while (builder.Length != 16);
最佳答案
考虑实现 shuffle algorithm用它你可以用独特的字符打乱你的字符串,然后只选择前 16 个字符。
您可以就地执行此操作,方法是分配单个 StringBuffer
,它将包含您的初始数据(“abc ....”),并仅使用 Durstenfeld 的算法版本来改变您的缓冲区,而不是返回前 16 个字符。
关于c# - 没有重复的随机字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15185369/