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]