最近,因工作需要天生一个不重复的随机字符串,园子里查了没有找到符合的。找了其他的作为参考并修改了下,记载一下。- /// <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[num % sc.Length] + str;
- num = num / sc.Length;
- }
- var ret = sc[num] + 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[index];
- }
- //拼接
- return pre + ret;
- }
- }
复制代码 调用,查看结果
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |