我正在尝试使用NO DUPLICATE CHARS生成16个字符随机字符串。我觉得它不应该很难但我被卡住了。
我正在使用2种方法,一种用于生成密钥,另一种用于删除重复的字符。在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);
答案 0 :(得分:8)
考虑实施shuffle algorithm,您将使用唯一字符对字符串进行随机播放,然后只选取前16个字符。
你可以通过分配包含你的初始数据(“abc ....”)的单个StringBuffer
就地这样做,并且只使用Durstenfeld的算法版本来改变你的缓冲区,而不是先返回16个字符。
答案 1 :(得分:7)
有很多算法。
一个简单的方法是:
示例代码:
using System;
namespace ConsoleApplication2
{
internal class Program
{
private static void Main(string[] args)
{
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
Random rng = new Random();
for (int i = 0; i < 10; ++i)
{
string randomString = RandomString(16, chars, rng);
Console.WriteLine(randomString);
}
}
public static string RandomString(int n, char[] chars, Random rng)
{
Shuffle(chars, rng);
return new string(chars, 0, n);
}
public static void Shuffle(char[] array, Random rng)
{
for (int n = array.Length; n > 1; )
{
int k = rng.Next(n);
--n;
char temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
}
}
答案 2 :(得分:5)
const string chars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
var r = new Random();
var s = new string(chars.OrderBy(x => r.Next()).Take(16).ToArray());
答案 3 :(得分:0)
我正在使用GUID生成方法,它本身会生成随机字符串,如果数字出现在开头,您可以修改它, 使用下面给出的代码:
string guid = System.Guid.NewGuid().ToString("N");
while (char.IsDigit(guid[0]))
guid = System.Guid.NewGuid().ToString("N");
希望有所帮助。
答案 4 :(得分:0)
看看这是否有帮助:
RandomString()
{
string randomStr = Guid.NewGuid().ToString();
randomStr = randomStr.Replace("-", "").Substring(0, 16);
Console.WriteLine(randomStr);
}
返回字母数字字符串。