我怎么能写一个方法,返回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请求必须是唯一的,我怎么能保证它基本上…如果可能的话,我不想保留一个列表并查询它…

我怎么能写一个方法,返回6个字符长度的唯一字符串

  • 找出小于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());
}