C# 生成唯一订单号

根据GUID+DateTime.Now.Ticks生产唯一订单号。

    /// <summary>
    /// 生成唯一数
    /// </summary>
    public class UniqueData
    {
        private static object obj = new object();
        private static int GuidInt { get { return Guid.NewGuid().GetHashCode(); } }
        private static string GuidIntStr { get { return Math.Abs(GuidInt).ToString(); } }

        /// <summary>
        /// 生成
        /// </summary>
        /// <param name="mark">前缀</param>
        /// <param name="timeType">时间精确类型  1 日,2 时,3 分,4 秒(默认) </param>
        /// <param name="id">id 小于或等于0则随机生成id</param>
        /// <returns></returns>
        public static string Gener(string mark, int timeType = 4, int id = 0)
        {
            lock (obj)
            {
                var number = mark;
                var ticks = (DateTime.Now.Ticks - GuidInt).ToString();
                int fillCount = 0;//填充位数

                number += GetTimeStr(timeType, out fillCount);
                if (id > 0)
                {
                    number += ticks.Substring(ticks.Length - (fillCount + 3)) + id.ToString().PadLeft(10, '0');
                }
                else
                {
                    number += ticks.Substring(ticks.Length - (fillCount + 3)) + GuidIntStr.PadLeft(10, '0');
                }
                return number;
            }
        }

        /// <summary>
        /// 生成
        /// </summary>
        /// <param name="mark">前缀</param>
        /// <param name="timeType">时间精确类型  1 日,2 时,3 分,4 秒(默认)</param>
        /// <param name="id">id 小于或等于0则随机生成id</param>
        /// <returns></returns>
        public static string GenerLong(string mark, int timeType = 4, long id = 0)
        {
            lock (obj)
            {
                var number = mark;
                var ticks = (DateTime.Now.Ticks - GuidInt).ToString();
                int fillCount = 0;//填充位数

                number += GetTimeStr(timeType, out fillCount);
                if (id > 0)
                {
                    number += ticks.Substring(ticks.Length - fillCount) + id.ToString().PadLeft(19, '0');
                }
                else
                {
                    number += GuidIntStr.PadLeft(10, '0') + ticks.Substring(ticks.Length - (9 + fillCount));
                }
                return number;
            }
        }

        /// <summary>
        /// 获取时间字符串
        /// </summary>
        /// <param name="timeType">时间精确类型  1 日,2 时,3 分,4 秒(默认)</param>
        /// <param name="fillCount">填充位数</param>
        /// <returns></returns>
        private static string GetTimeStr(int timeType, out int fillCount)
        {
            var time = DateTime.Now;
            if (timeType == 1)
            {
                fillCount = 6;
                return time.ToString("yyyyMMdd");
            }
            else if (timeType == 2)
            {
                fillCount = 4;
                return time.ToString("yyyyMMddHH");
            }
            else if (timeType == 3)
            {
                fillCount = 2;
                return time.ToString("yyyyMMddHHmm");
            }
            else
            {
                fillCount = 0;
                return time.ToString("yyyyMMddHHmmss");
            }
        }
    }
C#生成一个14位不重复的订单号,通常可以结合时间戳、随机数以及一些固定的标识符。下面是一个简单的示例,这里假设我们已经有一个存储历史订单号的数据库表: ```csharp using System; using System.Data.SqlClient; using System.Linq; public class OrderGenerator { private const string TableName = "OrderHistory"; private const int MaxValue = (int)DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond; // 使用当前时间作为基础,保证唯一 public string GenerateUniqueOrderId() { var orderId = Guid.NewGuid().ToString("N"); // 使用Guid作为基本值,保证全局唯一 int timestampPart = Convert.ToInt32(orderId.Substring(0, 13)); // 提取时间部分 using (var connection = new SqlConnection("your_connection_string_here")) // 替换为实际连接字符串 { connection.Open(); string query = $"SELECT COUNT(*) FROM {TableName} WHERE Timestamp > {timestampPart}"; var count = connection.ExecuteScalar<int>(query); if (count == 0) { return orderId; } else { orderId = GenerateNewOrderIdIfDuplicate(timestampPart); return orderId; } } } private string GenerateNewOrderIdIfDuplicate(int timestampPart) { // 如果时间戳部分已存在记录,则递增直到找到唯一的组合 for (int i = 1; ; i++) { orderId = $"{orderId.Substring(1)}{i}"; query = $"SELECT COUNT(*) FROM {TableName} WHERE Timestamp = {timestampPart}{orderId.Substring(13)}"; int duplicateCount = connection.ExecuteScalar<int>(query); if (duplicateCount == 0) { return orderId; } } } } ``` 这个类首先尝试生成一个新的 GUID,然后检查其时间戳部分是否在历史记录中已存在。如果不存在,就直接返回;如果存在,它会递增数字并再次查询,直到找到一个未使用的组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值