翼度科技»论坛 编程开发 .net 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
最近,因工作需要生成一个不重复的随机字符串,园子里查了没有找到合适的。找了其他的作为参考并修改了下,记录一下。
  1. /// <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>
  2. /// 创建一个在本地唯一的短字符串生成对象
  3. /// </summary>
  4. public MyConsoleDemoModule()
  5. {
  6.     if (sc == null)
  7.     {
  8.         //根据需求可加入小写abcdefghijklmnopqrstuvwxyz
  9.         sc = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
  10.         //起始时间越大,时间戳就越小,字符串才能越短
  11.         startTime = new DateTime(2024, 10, 12, 0, 0, 0, 0);
  12.         //位数设置
  13.         len = 8;
  14.     }
  15. }
复制代码
 
 生成方法:
  1.     /// <summary>
  2.     /// 生成一个唯一的短字符串
  3.     /// </summary>
  4.     public string Create()
  5.     {
  6.         lock (_lock)
  7.         {
  8.             //使用时间戳确保不会重复
  9.             TimeSpan ts = DateTime.UtcNow - startTime;
  10.             //毫秒1000*10,每秒自增(0-9999)
  11.             long tempSeconds = Convert.ToInt64(ts.TotalMilliseconds * 10);
  12.             //防重复冗余设置(前缀自增,未超过当前时间戳就用)
  13.             prve = tempSeconds > prve ? tempSeconds : prve++;
  14.             //获取字符串
  15.             return GetShortString(prve, len);
  16.         }
  17.     }
复制代码
字符串处理:
  1.     /// <summary>
  2.     /// 使用进制生成短字符串
  3.     /// </summary>
  4.     /// <param name="num">毫秒自增时间戳</param>
  5.     /// <param name="len">位数设置</param>
  6.     /// <returns></returns>
  7.     private string GetShortString(long num, int len)
  8.     {
  9.         var str = "";
  10.         while (num >= sc.Length)
  11.         {
  12.             //取余赋值
  13.             str = sc[num % sc.Length] + str;
  14.             num = num / sc.Length;
  15.         }
  16.         var ret = sc[num] + str;
  17.         if (ret.Length > len)
  18.         {
  19.             return ret.Substring(0, len);
  20.         }
  21.         else
  22.         {
  23.             var pre = string.Empty;
  24.             for (int x = 0; x < len - ret.Length; x++)
  25.             {
  26.                 Random random = new Random();
  27.                 //随机取字符串数组字符
  28.                 var index = random.Next(0, (sc.Length - 1));
  29.                 //累加字符串
  30.                 pre += sc[index];
  31.             }
  32.             //拼接
  33.             return pre + ret;
  34.         }
  35.     }
复制代码
调用,查看结果

 

来源:https://www.cnblogs.com/youyoufei/p/18469486
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具