SnowFlake.php 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace app\common\library;
  3. /**
  4. * 雪花ID生成类
  5. */
  6. class SnowFlake
  7. {
  8. /**
  9. * @var int 起始时间戳
  10. */
  11. const EPOCH = 1672502400000;
  12. /**
  13. * @var int
  14. */
  15. const max41bit = 1099511627775;
  16. /**
  17. * @var int 机器节点 10bit
  18. */
  19. static $machineId = 1;
  20. /**
  21. * 序列号
  22. */
  23. static $count = 0;
  24. /**
  25. * 最后一次生成ID的时间偏移量
  26. */
  27. static $last = 0;
  28. /**
  29. * 设置机器节点
  30. * @param int $mId 机器节点id
  31. */
  32. public static function setMachineId(int $mId)
  33. {
  34. self::$machineId = $mId;
  35. }
  36. public static function generateParticle()
  37. {
  38. // 当前时间 42bit
  39. $time = (int)floor(microtime(true) * 1000);
  40. // 时间偏移量
  41. $time -= self::EPOCH;
  42. // 起始时间戳加上时间偏移量并转为二进制
  43. $base = decbin(self::max41bit + $time);
  44. // 追加节点机器id
  45. if (!is_null(self::$machineId)) {
  46. $machineId = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);
  47. $base .= $machineId;
  48. }
  49. // 序列号
  50. if ($time == self::$last) {
  51. self::$count++;
  52. } else {
  53. self::$count = 0;
  54. }
  55. // 追加序列号部分
  56. $sequence = str_pad(decbin(self::$count), 12, "0", STR_PAD_LEFT);
  57. $base .= $sequence;
  58. // 保存生成ID的时间偏移量
  59. self::$last = $time;
  60. // 返回64bit二进制数的十进制标识
  61. return bindec($base);
  62. }
  63. }