C# 在C语言中生成多个唯一字符串#
对于我的项目,我必须生成唯一字符串的列表。 一切都很好,但我的问题是,它在最后非常缓慢。 我尝试过使用并行循环,但我发现我使用的C# 在C语言中生成多个唯一字符串#,c#,string,unique,C#,String,Unique,对于我的项目,我必须生成唯一字符串的列表。 一切都很好,但我的问题是,它在最后非常缓慢。 我尝试过使用并行循环,但我发现我使用的ConcurrentBag,速度也很慢。 现在我使用了一个简单的for循环和列表,它现在稍微快一点,但也非常慢 这是我的密码: private List<string> Generate(int start, int end, bool allowDupes) { var list = new List<string>()
ConcurrentBag
,速度也很慢。
现在我使用了一个简单的for循环和列表
,它现在稍微快一点,但也非常慢
这是我的密码:
private List<string> Generate(int start, int end, bool allowDupes)
{
var list = new List<string>();
var generator = new StringGenerator(LowerCase, UpperCase, Digits, NumberOfCharacters);
for (var i = start; i < end; i++)
{
StringBuilder sb;
while (true)
{
sb = new StringBuilder();
for (var j = 0; j < NumberOfSegments; j++)
{
sb.Append(generator.GenerateRandomString());
if (j < NumberOfSegments - 1)
{
sb.Append(Delimiter);
}
}
if (!allowDupes)
{
if (list.Contains(sb.ToString()))
{
continue;
}
}
break;
}
list.Add(sb.ToString());
GeneratedStringCount = i + 1;
}
return new List<string>(list);
}
private List-Generate(int-start、int-end、bool-allowDupes)
{
var list=新列表();
var生成器=新的StringGenerator(小写、大写、数字、NumberOfCharacters);
对于(变量i=开始;i<结束;i++)
{
为某人做准备;
while(true)
{
sb=新的StringBuilder();
对于(var j=0;j
我也和我的老师谈过,他会用同样的算法生成这些字符串。
你知道更好的解决办法吗?(
StringGenerator
中的GeneratorDomainString()
方法简单,不会消耗太多性能。list.Contains(xy)
消耗大量资源。[Visual Studio中的性能分析])list.Contains
速度较慢。使用哈希集
private List<string> Generate(int start, int end, bool allowDupes)
{
var strings = new HashSet<string>();
var list = new List<string>();
var generator = new StringGenerator(LowerCase, UpperCase, Digits, NumberOfCharacters);
for (var i = start; i < end; i++)
{
while (true)
{
string randomString = GetRandomString();
if (allowDupes || strings.Add(randomString))
{
list.Add(randomString);
break;
}
}
GeneratedStringCount = i + 1;
}
return new List<string>(list);
}
private string GetRandomString()
{
var segments = Enumerable.Range(1, NumberOfSegments)
.Select(_ => generator.GenerateRandomString());
var result = string.Join(Delimeter, segments);
return result;
}
private List-Generate(int-start、int-end、bool-allowDupes)
{
var strings=newhashset();
var list=新列表();
var生成器=新的StringGenerator(小写、大写、数字、NumberOfCharacters);
对于(变量i=开始;i<结束;i++)
{
while(true)
{
string randomString=GetRandomString();
if(allowDupes | | strings.Add(randomString))
{
list.Add(随机字符串);
打破
}
}
GeneratedStringCount=i+1;
}
返回新列表(列表);
}
私有字符串GetRandomString()
{
变量段=可枚举范围(1,NumberOfSegments)
.Select(=>generator.GenerateRandomString());
var result=string.Join(Delimeter,segments);
返回结果;
}
这仍然有可能导致性能降低,但您可以使用智能的
GeneratorAndomString
函数来解决这一问题。起点和终点是什么?它看起来像是一个简单的计算你想要多少。为什么返回新列表(List)
而不是返回列表
?这些字符串的内容有哪些限制?尝试使用哈希集而不是列表如果您需要大量的strings@JonesyWell start和end的用法如下:如果已经生成了X字符串,但是您需要生成更多,您的“开始”有列表。Count
值,而不是计算差值@MichaelGoldshteyn你能解释一下你的约束是什么意思吗@ReneNiediek是的,我有很多字符串(>100k),也许哈希集更好。谢谢,现在它快多了。(~32秒,100万个字符串)我将尝试优化我的GenerateRandomString()
方法。
public static String GenerateEightCode( int codeLenght, Boolean isCaseSensitive)
{
char[] chars = GetCharsForCode(isCaseSensitive);
byte[] data = new byte[1];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data);
data = new byte[codeLenght];
crypto.GetNonZeroBytes(data);
StringBuilder sb = new StringBuilder(codeLenght);
foreach (byte b in data)
{
sb.Append(chars[b % (chars.Length)]);
}
string key = sb.ToString();
if (codeLenght == 8)
key = key.Substring(0, 4) + "-" + key.Substring(4, 4);
else if (codeLenght == 16)
key = key.Substring(0, 4) + "-" + key.Substring(4, 4) + "-" + key.Substring(8, 4) + "-" + key.Substring(12, 4);
return key.ToString();
}
private static char[] GetCharsForCode(Boolean isCaseSensitive)
{
// all - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
char[] chars = new char[58];
if (isCaseSensitive)
{
chars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789".ToCharArray();//počet unikátních kombinací 4 - 424 270, 8 - 1 916 797 311, 16 - 7.99601828013E+13
}
else
{
chars = new char[35];
chars = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789".ToCharArray();//počet unikátních kombinací 4 - 52 360, 8 - 23 535 820, 16 - 4 059 928 950
}
return chars;
}