GenerateId.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // ***********************************************************************
  2. // <copyright file="GenerateId.cs" company="">
  3. // Copyright (c) . All rights reserved.
  4. // </copyright>
  5. // <summary>创建唯一ID</summary>
  6. // ***********************************************************************
  7. using System;
  8. using System.Security.Cryptography;
  9. namespace CommonTool
  10. {
  11. public class GenerateId
  12. {
  13. public static string GetGuidHash()
  14. {
  15. return Guid.NewGuid().ToString().GetHashCode().ToString("x");
  16. }
  17. /// <summary>
  18. /// 生成一个长整型,可以转成19字节长的字符串
  19. /// </summary>
  20. /// <returns>System.Int64.</returns>
  21. public static long GenerateLong()
  22. {
  23. byte[] buffer = Guid.NewGuid().ToByteArray();
  24. return BitConverter.ToInt64(buffer, 0);
  25. }
  26. /// <summary>
  27. /// 生成16个字节长度的数据与英文组合串
  28. /// </summary>
  29. public static string GenerateStr()
  30. {
  31. long i = 1;
  32. foreach (byte b in Guid.NewGuid().ToByteArray())
  33. {
  34. i *= (b + 1);
  35. }
  36. return $"{i - DateTime.Now.Ticks:x}";
  37. }
  38. /// <summary>
  39. /// 创建11位的英文与数字组合
  40. /// </summary>
  41. /// <returns>System.String.</returns>
  42. public static string ShortStr()
  43. {
  44. return Convert(GenerateLong());
  45. }
  46. /// <summary>
  47. /// 唯一订单号生成
  48. /// </summary>
  49. /// <returns></returns>
  50. public static string GenerateOrderNumber()
  51. {
  52. string strDateTimeNumber = DateTime.Now.ToString("yyyyMMddHHmmssffff");
  53. string strRandomResult = NextRandom(1000, 1).ToString("0000");
  54. return strDateTimeNumber + strRandomResult;
  55. }
  56. #region private
  57. /// <summary>
  58. /// 参考:msdn上的RNGCryptoServiceProvider例子
  59. /// </summary>
  60. /// <param name="numSeeds"></param>
  61. /// <param name="length"></param>
  62. /// <returns></returns>
  63. private static int NextRandom(int numSeeds, int length)
  64. {
  65. // Create a byte array to hold the random value.
  66. byte[] randomNumber = new byte[length];
  67. // Create a new instance of the RNGCryptoServiceProvider.
  68. RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  69. // Fill the array with a random value.
  70. rng.GetBytes(randomNumber);
  71. // Convert the byte to an uint value to make the modulus operation easier.
  72. uint randomResult = 0x0;
  73. for (int i = 0; i < length; i++)
  74. {
  75. randomResult |= (uint) randomNumber[i] << ((length - 1 - i)*8);
  76. }
  77. return (int) (randomResult%numSeeds) + 1;
  78. }
  79. static string Seq = "s9LFkgy5RovixI1aOf8UhdY3r4DMplQZJXPqebE0WSjBn7wVzmN2Gc6THCAKut";
  80. /// <summary>
  81. /// 10进制转换为62进制
  82. /// </summary>
  83. /// <param name="id"></param>
  84. /// <returns></returns>
  85. private static string Convert(long id)
  86. {
  87. if (id < 62)
  88. {
  89. return Seq[(int) id].ToString();
  90. }
  91. int y = (int) (id%62);
  92. long x = id/62;
  93. return Convert(x) + Seq[y];
  94. }
  95. #endregion
  96. }
  97. }