迷恋自留地 发表于 2021-7-2 18:09

生成随机不重复单号



BillNoHelper.GenerateCouponKey();
```

    public class BillNoHelper
    {

      /// <summary>
      ///防止创建类的实例
      /// </summary>
      private BillNoHelper() { }
      private static readonly object locker = new object();
      private static int _sn = 0;
      /// <summary>
      /// 生成单据编号
      /// </summary>
      /// <returns></returns>
      public static string GenerateId()
      {
            lock (locker)   //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
            {
                if (_sn == 9999)
                {
                  _sn = 1;
                }
                else
                {
                  _sn++;
                }
                return DateTime.Now.ToString("yyMMddHHmmss") + _sn.ToString().PadLeft(4, '0');
            }
      }
      /// <summary>
      /// 唯一值
      /// </summary>
      /// <returns></returns>
      public static string guid()
      {
            return Guid.NewGuid().ToString().Replace("-", "");
      }
      /// <summary>
      /// GuidExtension
      /// </summary>
      /// <param name="guid"></param>
      /// <returns></returns>
      public static string IsNum(Guid guid)
      {
            var s = guid.ToString();
            var sb = new StringBuilder();
            for (int i = 0; i < s.Length; i++)
            {
                if (Char.IsNumber(s, i))
                {
                  sb.Append(s.Substring(i, 1));
                }
            }
            return sb.ToString();
      }


      #region 生成 Coupon Key
      private static readonly object locker2 = new object();
      private static int _sn2 = 0;
      /// <summary>
      /// 生成key 12位字母+数字
      /// </summary>
      /// <returns></returns>
      public static string GenerateCouponKey()//
      {
            string s;
            lock (locker2)
            {
                if (_sn2 == 9999999)
                {
                  _sn2 = 1;
                }
                else
                {
                  _sn2++;
                }
                s = $"Qq@,.*745u787#$@,.><;'{DateTime.Now.Ticks}{_sn2}";
            }
            return MD5_16(s);

      }
      private static string MD5_16(string p_str)
      {

            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] data = System.Text.Encoding.Default.GetBytes(p_str);
            byte[] md5Data = md5.ComputeHash(data);
            string strResult = System.BitConverter.ToString(md5Data, 4, 8);
            md5.Clear();
            strResult = strResult.Replace("-", "").ToUpper();
            return strResult;
      }
      #endregion

    }
```

迷恋自留地 发表于 2021-7-4 22:18

xiaovssha 发表于 2021-7-2 23:37
DateTime.Now.ToString("yyMMddHHmmss") + _sn.ToString().PadLeft(4, '0');

不抬杠,你是对的。只是个方法,理论上不会有一秒一万单,可以考虑雪花id

侃遍天下无二人 发表于 2021-7-2 19:40

直接拿UUID当单号不就行了

nanaqilin 发表于 2021-7-2 20:45

侃遍天下无二人 发表于 2021-7-2 19:40
直接拿UUID当单号不就行了

对,我也有这个想法,UUID本身就不重复的啊

Js_Aaron 发表于 2021-7-2 20:55

UUID 不行吗

Gaoqi12355 发表于 2021-7-2 21:42

怎么使用啊

exnet 发表于 2021-7-2 23:29

有点复杂

xiaovssha 发表于 2021-7-2 23:37

DateTime.Now.ToString("yyMMddHHmmss") + _sn.ToString().PadLeft(4, '0');1秒内有1w以上的单,就重复了鸭

迷恋自留地 发表于 2021-7-4 22:18

Js_Aaron 发表于 2021-7-2 20:55
UUID 不行吗

单号,可以用作核销之类的

迷恋自留地 发表于 2021-7-4 22:21

Gaoqi12355 发表于 2021-7-2 21:42
怎么使用啊
静态方法,创建类,将代码复制过去,直接调用就好了BillNoHelper.GenerateCouponKey();
页: [1] 2
查看完整版本: 生成随机不重复单号