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.

SnowWorkerM2.c 1.1 kB

4 years ago
123456789101112131415161718192021222324252627282930
  1. /*
  2. * 版权属于:yitter(yitter@126.com)
  3. * 代码翻译:amuluowin
  4. * 代码修订:yitter
  5. * 开源地址:https://gitee.com/yitter/idgenerator
  6. */
  7. #include <malloc.h>
  8. #include <stdlib.h>
  9. #include <pthread.h>
  10. #include "SnowWorkerM2.h"
  11. extern uint64_t WorkerM2NextId(SnowFlakeWorker *worker) {
  12. pthread_mutex_lock(&ThreadMutex);
  13. uint64_t currentTimeTick = GetCurrentTimeTick(worker);
  14. if (worker->_LastTimeTick == currentTimeTick) {
  15. worker->_CurrentSeqNumber = (++worker->_CurrentSeqNumber) & worker->MaxSeqNumber;
  16. if (worker->_CurrentSeqNumber == 0) {
  17. currentTimeTick = GetNextTimeTick(worker);
  18. }
  19. } else {
  20. worker->_CurrentSeqNumber = worker->MinSeqNumber;
  21. }
  22. worker->_LastTimeTick = currentTimeTick;
  23. uint64_t id = (uint64_t) ((currentTimeTick << worker->_TimestampShift) |
  24. (worker->WorkerId << worker->SeqBitLength) |
  25. worker->_CurrentSeqNumber);
  26. pthread_mutex_unlock(&ThreadMutex);
  27. return id;
  28. }

雪花算法中非常好用的数字ID生成器