• 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;
            }
        }
  • 相关阅读:
    HANDLER进行堆叠注入
    CDUT第一届信安大挑战Re-wp
    Nu1LBook第一章wp
    Linux和VMWare
    [MRCTF]Xor
    IDA 调整栈帧 (411A04:positive sp value has been found)
    [BUU] 简单注册器
    2020年“安洵杯”四川省大学生信息安全技术大赛 部分WRITEUP
    关于我的pip不听话,总是说【Fatal error in launcher: Unable to create process using '"'】这件事
    C语言的PELode编写记录
  • 原文地址:https://www.cnblogs.com/luludongxu/p/13204343.html
Copyright © 2020-2023  润新知