You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

uDefaultIdGenerator.pas 3.8 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. unit uDefaultIdGenerator;
  2. interface
  3. uses
  4. uIIdGenerator, uISnowWorker, uIdGeneratorOptions, System.DateUtils, System.SysUtils;
  5. type
  6. TDefaultIdGenerator = class(TInterfacedObject, IIdGenerator)
  7. private
  8. SnowWorker: ISnowWorker;
  9. public
  10. constructor Create(options: TIdGeneratorOptions); overload;
  11. function NewLong(): Int64;
  12. end;
  13. implementation
  14. uses
  15. uSnowWorkerM1, uSnowWorkerM2, uSnowWorkerM3;
  16. { TDefaultIdGenerator }
  17. function GetMillisecondTimeStamp(ET: TDateTime): Int64;
  18. var
  19. ST: TDateTime;
  20. begin
  21. ST := EncodeDateTime(1970, 1, 1, 0, 0, 0, 0);
  22. Result := MilliSecondsBetween(ET, ST) - 28800000; // 8*60*60*1000;
  23. end;
  24. constructor TDefaultIdGenerator.Create(options: TIdGeneratorOptions);
  25. var
  26. MaxLength, MaxWorkerIdNumber, MaxDataCenterIdNumber, MaxSeqNumber: Integer;
  27. begin
  28. if (options = nil) then
  29. begin
  30. raise Exception.Create('options error.');
  31. end;
  32. // 1.BaseTime
  33. if (options.BaseTime < GetMillisecondTimeStamp(IncYear(Now(), -50))) or
  34. (options.BaseTime > GetMillisecondTimeStamp(Now())) then
  35. begin
  36. raise Exception.Create('BaseTime error.');
  37. end;
  38. // 2.WorkerIdBitLength
  39. if (options.TimestampType = 0) then
  40. MaxLength := 22
  41. else
  42. MaxLength := 31; // 뼶ʱʱŴ31λ
  43. if (options.WorkerIdBitLength <= 0) then
  44. begin
  45. raise Exception.Create('WorkerIdBitLength error.(range:[1, 21])');
  46. end;
  47. if (options.DataCenterIdBitLength + options.WorkerIdBitLength + options.SeqBitLength > MaxLength) then
  48. begin
  49. raise Exception.Create('errorDataCenterIdBitLength + WorkerIdBitLength + SeqBitLength <= ' + IntToStr(MaxLength));
  50. end;
  51. // 3.WorkerId
  52. MaxWorkerIdNumber := (1 shl options.WorkerIdBitLength) - 1;
  53. if (MaxWorkerIdNumber = 0) then
  54. begin
  55. MaxWorkerIdNumber := 63;
  56. end;
  57. if ((options.WorkerId < 0) or (options.WorkerId > MaxWorkerIdNumber)) then
  58. begin
  59. raise Exception.Create('WorkerId error. (range:[0, ' + IntToStr(MaxWorkerIdNumber) + ']');
  60. end;
  61. MaxDataCenterIdNumber := (1 shl options.DataCenterIdBitLength) - 1;
  62. if (options.DataCenterId < 0) or (options.DataCenterId > MaxDataCenterIdNumber) then
  63. begin
  64. raise Exception.Create('DataCenterId error. (range:[0, ' + IntToStr(MaxDataCenterIdNumber) + ']');
  65. end;
  66. // 4.SeqBitLength
  67. if ((options.SeqBitLength < 2) or (options.SeqBitLength > 21)) then
  68. begin
  69. raise Exception.Create('SeqBitLength error. (range:[2, 21])');
  70. end;
  71. // 5.MaxSeqNumber
  72. MaxSeqNumber := (1 shl options.SeqBitLength) - 1;
  73. if (MaxSeqNumber = 0) then
  74. begin
  75. MaxSeqNumber := 63;
  76. end;
  77. if ((options.MaxSeqNumber < 0) or (options.MaxSeqNumber > MaxSeqNumber)) then
  78. begin
  79. raise Exception.Create('MaxSeqNumber error. (range:[1, ' + IntToStr(MaxSeqNumber) + ']');
  80. end;
  81. // 6.MinSeqNumber
  82. if ((options.MinSeqNumber < 5) or (options.MinSeqNumber > MaxSeqNumber)) then
  83. begin
  84. raise Exception.Create('MinSeqNumber error. (range:[5, ' + IntToStr(MaxSeqNumber) + ']');
  85. end;
  86. // 7.TopOverCostCount
  87. if ((options.TopOverCostCount < 0) or (options.TopOverCostCount > 10000)) then
  88. begin
  89. raise Exception.Create('TopOverCostCount error. (range:[0, 10000]');
  90. end;
  91. case (options.Method) of
  92. 2:
  93. begin
  94. SnowWorker := TSnowWorkerM2.Create(options);
  95. end;
  96. else
  97. begin
  98. if ((options.DataCenterIdBitLength = 0) and (options.TimestampType = 0)) then
  99. begin
  100. SnowWorker := TSnowWorkerM1.Create(options);
  101. end
  102. else
  103. begin
  104. SnowWorker := TSnowWorkerM3.Create(options);
  105. end;
  106. end;
  107. end;
  108. if (options.Method <> 2) then
  109. begin
  110. Sleep(500);
  111. end;
  112. end;
  113. function TDefaultIdGenerator.NewLong(): Int64;
  114. begin
  115. Result := SnowWorker.NextId();
  116. end;
  117. end.