杜容 发表于 2024-10-23 10:23:13

C# 生成不重复的短字符串

最近,因工作需要生成一个不重复的随机字符串,园子里查了没有找到合适的。找了其他的作为参考并修改了下,记录一下。
/// <summary><br>/// 可用字符<br>/// </summary><br>static char[] sc;<br>/// <summary><br>/// 起始时间<br>/// </summary><br>static DateTime startTime;<br><br>/// <summary><br>/// 字符串前缀<br>/// </summary><br>static long prve = 0;<br>/// <summary><br>/// 位数设置<br>/// </summary><br>static int len = 0;<br><br>/// <summary><br>/// 锁<br>/// </summary><br>static readonly object _lock = new object();<br><br>/// <summary>
/// 创建一个在本地唯一的短字符串生成对象
/// </summary>
public MyConsoleDemoModule()
{
    if (sc == null)
    {
      //根据需求可加入小写abcdefghijklmnopqrstuvwxyz
      sc = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
      //起始时间越大,时间戳就越小,字符串才能越短
      startTime = new DateTime(2024, 10, 12, 0, 0, 0, 0);
      //位数设置
      len = 8;
    }

 生成方法:
    /// <summary>
    /// 生成一个唯一的短字符串
    /// </summary>
    public string Create()
    {
      lock (_lock)
      {
            //使用时间戳确保不会重复
            TimeSpan ts = DateTime.UtcNow - startTime;
            //毫秒1000*10,每秒自增(0-9999)
            long tempSeconds = Convert.ToInt64(ts.TotalMilliseconds * 10);
            //防重复冗余设置(前缀自增,未超过当前时间戳就用)
            prve = tempSeconds > prve ? tempSeconds : prve++;
            //获取字符串
            return GetShortString(prve, len);
      }
    }字符串处理:
    /// <summary>
    /// 使用进制生成短字符串
    /// </summary>
    /// <param name="num">毫秒自增时间戳</param>
    /// <param name="len">位数设置</param>
    /// <returns></returns>
    private string GetShortString(long num, int len)
    {
      var str = "";
      while (num >= sc.Length)
      {
            //取余赋值
            str = sc + str;
            num = num / sc.Length;
      }
      var ret = sc + str;

      if (ret.Length > len)
      {
            return ret.Substring(0, len);
      }
      else
      {
            var pre = string.Empty;
            for (int x = 0; x < len - ret.Length; x++)
            {
                Random random = new Random();
                //随机取字符串数组字符
                var index = random.Next(0, (sc.Length - 1));
                //累加字符串
                pre += sc;
            }
            //拼接
            return pre + ret;
      }
    }调用,查看结果

 

来源:https://www.cnblogs.com/youyoufei/p/18469486
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: C# 生成不重复的短字符串