我怎么能写一个方法,返回6个字符长度的唯一字符串
本文关键字:字符 6个 返回 字符串 唯一 方法 怎么能 一个 | 更新日期: 2023-09-27 18:16:08
如果我这样做,我会得到一些重复的…
private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123654987";
public string RandomString(int size)
{
var random = new Random((int)DateTime.Now.Ticks);
Thread.Sleep(random.Next(1, 3));
var buffer = new char[size];
for (int i = 0; i < size; i++)
{
buffer[i] = _chars[random.Next(_chars.Length)];
}
return new string(buffer);
}
第一个100000请求必须是唯一的,我怎么能保证它基本上…如果可能的话,我不想保留一个列表并查询它…
- 找出小于35^6(可能的组合数)的最大素数
- 选择一个小于该值但大于1的随机数
- 取(素数%(随机数*迭代索引))。这是你的字符串的基础。
- 以基数35表示结果,并创建您的字符串
这些字符串在100,000次迭代中不会重叠,因为您的随机数相对于较大的数字是素数。不需要缓存
您可以在记录字符串之前运行随机次数的迭代,以便为自己提供更大的结果空间。
如果你的随机字符串可能的长度是有限的,那么使用guid将是最简单的:
一个粗略的实现可能是:
public string RandomString(int size)
{
return Guid.NewGuid()
.ToString()
.Replace("-","")
.Substring(0, size);
}
如果您需要更长的GUID字符串,那么您可以将多个GUID字符串连接在一起。
不要保存所有早期值的列表。就用计数器吧
如果您想让值对用户来说更不可预测(不可猜测),请在使用比特之前使用散列函数对其进行打乱。但是仍然从一个简单的计数器生成哈希的下一个输入。
如果您使用int型来表示位位置,则可以轻松实现。
int bits=0
...
while(bitCount(bits)!=6) // Write your own bitCount method--or there is probably one on the net
bits++;
现在你知道整型有6位,所以把它们转换成字符串
例如你的数据:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ123654987"
如果你数到111111,你会返回"234567",我相信下一个是1011111,它会返回"134567",然后是1101111,它会返回"124567"。(我可能把顺序弄错了,这只是我的头的顶部)。
它永远是唯一的,迭代并不像你想象的那么昂贵,尽管你可能比迭代更聪明一点(如果你发现在n个增量之前不可能到达下一个6"on"位,你可以跳过大的组,或者你可以想出一个更直接的算法来生成下一个有6个1的整数。
您可以使用当前时间戳(毫秒,微秒或纳秒)(如果需要显示随机性,则将其反转或更改数字顺序),并在某些条件下将时间戳中的数字替换为a - z和0-9字符。
如果你没有任何缓存机制来存储以前生成的值,我认为你不能得到随机和唯一的字符序列。如果它们不需要随机而只需要唯一,则此代码使用里程表类型的输出。
public class Class1
{
List<char> _chars = new List<char>() { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2','3','4', '5', '6', '7', '8', '9', '0' };
private static int[] index = new int[6] {0, 0, 0, 0, 0, 0};
private const int charMax = 35;
public string UniqueString()
{
if (index[5] > charMax)
{
IncromentParent(5);
}
StringBuilder result = new StringBuilder();
result.Append(_chars[index[0]]);
result.Append(_chars[index[1]]);
result.Append(_chars[index[2]]);
result.Append(_chars[index[3]]);
result.Append(_chars[index[4]]);
result.Append(_chars[index[5]]);
index[5]++;
return result.ToString();
}
private void IncromentParent(int active)
{
if (active == 0)
throw new Exception("out of numbers");
int parent = active - 1;
index[active] = 0;
index[parent]++;
if (index[parent] > charMax)
IncromentParent(parent);
}
}
这是一个通过的单元测试,但是它需要很长时间来运行…
[TestMethod]
public void MyTestMethod()
{
Class1 target = new Class1();
List<string> results = new List<string>();
for (int i = 0; i < 100000; i++)
{
string result = target.UniqueString();
if (!results.Contains(result))
results.Add(result);
else
Assert.Fail(string.Format("The string '{0}' is already in the list", result));
}
Console.WriteLine(results.Count.ToString());
}