C# 生成一个当前程序唯一的短字符串
一般我们用Guid来生成随机字符串,但是Guid太长了,有的时候用起来很不爽
在特殊的环境下,我们其实并不需要用到全世界唯一的Guid,只要能达到本地唯一基本就够用了
基于这个需求,我开始构建代码,思路大概如下
1,使用时间戳来实现本地唯一
2,时间戳太长了,可以想办法缩短点
3,不直接使用1970.1.1到现在的时间戳,没必要,太浪费了
4,可以考虑使用字符串通过进制机制来缩短数字
生成的字符串长度为6个字符,相比于Guid的32个字符,长度被大幅度的缩减了
具体代码如下,
需要注意的是,长度的缩减是有代价的,该代码只在当前程序唯一,多个程序运行会产生冲突,还有就是即使是单一程序,如果在极短的时间内重启程序(静态变量prve重新初始化),也可能重复,局限性很大
/// <summary> /// 本地唯一短字符串 /// </summary> public class LocalUniqueShortString { /// <summary> /// 字符串可用字符,字符越多,长度越短 /// </summary> static char[] sc; static DateTime startTime; static long prve = 0; static readonly object _lock = new object(); /// <summary> /// 创建一个在本地唯一的短字符串生成对象 /// </summary> public LocalUniqueShortString() { if (sc == null) { string scString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; sc = scString.ToCharArray(); startTime = new DateTime(2020, 6, 1, 0, 0, 0, 0); //起始时间越大,时间戳就越小,字符串才能越短 } } /// <summary> /// 生成一个在应用程序中唯一的短字符串 /// </summary> public string Create() { lock (_lock) { TimeSpan ts = DateTime.UtcNow - startTime; //时间戳保证即使应用程序重启依然不会重复 long temp = Convert.ToInt64(ts.TotalMilliseconds * 10); //毫秒1000*10保证一秒最多9999可增长 if (temp > prve) { prve = temp; return ToShortString(temp); } else { prve++; return ToShortString(prve); } } } /// <summary> /// 通过进制机制将数字转成更短的字符串 /// </summary> private string ToShortString(long num) { string str = ""; while (num >= sc.Length) { str = sc[num % sc.Length] + str; num = num / sc.Length; } return sc[num] + str; } }
标签:
C#学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)