|
最近,因工作需要生成一个不重复的随机字符串,园子里查了没有找到合适的。找了其他的作为参考并修改了下,记录一下。- /// <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;
- }
- }
复制代码 调用,查看结果
来源:https://www.cnblogs.com/youyoufei/p/18469486
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|