SnowflakeIdGenerator.java 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package com.ruoyi.zzb.common;
  2. public class SnowflakeIdGenerator {
  3. private final long epoch = 1288834974657L; // 自定义的起始时间戳
  4. private final long machineIdBits = 5L; // 机器ID位数
  5. private final long sequenceBits = 12L; // 序列号位数
  6. private final long maxMachineId = -1L ^ (-1L << machineIdBits); // 最大机器ID
  7. private final long sequenceMask = -1L ^ (-1L << sequenceBits); // 最大序列号
  8. private long machineId; // 机器ID
  9. private long sequence = 0L; // 当前序列号
  10. private long lastTimestamp = -1L; // 上次时间戳
  11. public SnowflakeIdGenerator(long machineId) {
  12. if (machineId > maxMachineId || machineId < 0) {
  13. throw new IllegalArgumentException("Machine ID must be between 0 and " + maxMachineId);
  14. }
  15. this.machineId = machineId;
  16. }
  17. public synchronized long nextId() {
  18. long timestamp = System.currentTimeMillis();
  19. if (timestamp < lastTimestamp) {
  20. throw new RuntimeException("Clock moved backwards. Refusing to generate id");
  21. }
  22. if (timestamp == lastTimestamp) {
  23. sequence = (sequence + 1) & sequenceMask;
  24. if (sequence == 0) {
  25. timestamp = waitForNextMillis(lastTimestamp);
  26. }
  27. } else {
  28. sequence = 0;
  29. }
  30. lastTimestamp = timestamp;
  31. return ((timestamp - epoch) << (machineIdBits + sequenceBits))
  32. | (machineId << sequenceBits)
  33. | sequence;
  34. }
  35. private long waitForNextMillis(long lastTimestamp) {
  36. long timestamp = System.currentTimeMillis();
  37. while (timestamp <= lastTimestamp) {
  38. timestamp = System.currentTimeMillis();
  39. }
  40. return timestamp;
  41. }
  42. }