Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL生成雪花算法ID

MySQL生成雪花算法ID的实现示例

作者:honvin_

本文展示了SQL实现雪花ID算法的两种方式,第一种直接计算方式通过位运算组合时间戳、机器ID和序列号;第二种创建了可复用的snowflake_id函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简单sql版:

SELECT
  -- 1. 42位 毫秒级时间戳(高位):当前时间戳 *1000 转毫秒,左移22位留出后面空间
  FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000) << 22

  -- 2. 10位 机器ID(中间位):固定机器标识 c0WD7EOH,转为数字后左移12位
  | CRC32('c0WD7EOH') % 1024 << 12

  -- 3. 12位 序列号(低位):同一毫秒内的自增序列,这里用随机数模拟(真实场景用自增变量)
  | FLOOR(RAND() * 4096) AS id;

结果示例值:7458326199558728174

创建函数:

DROP FUNCTION IF EXISTS snowflake_id;
DELIMITER $$

CREATE FUNCTION snowflake_id(worker_name VARCHAR(50))
RETURNS BIGINT UNSIGNED
NO SQL
BEGIN
    DECLARE now_ms BIGINT UNSIGNED;
    DECLARE worker_id INT UNSIGNED;
    SET worker_id = CRC32(worker_name) % 1024;

    wait_loop: WHILE TRUE DO
        SET now_ms = FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000);

        SET @last_ms = IFNULL(@last_ms, now_ms);
        SET @seq = IFNULL(@seq, 0);

        -- 新毫秒 → 重置序列号
        IF now_ms <> @last_ms THEN
            SET @seq = 0;
            SET @last_ms = now_ms;
        END IF;

        -- 标准雪花:每毫秒 0~4095
        IF @seq <= 4095 THEN
            SET @seq = @seq + 1;
            LEAVE wait_loop;
        END IF;
    END WHILE wait_loop;

    RETURN (now_ms << 22) | (worker_id << 12) | @seq;
END$$

DELIMITER ;

使用:

# 参数为机器码,给个随机数就行,例:
SELECT snowflake_id('0bpb3rBC');

结果示例值:7458326199558728174

到此这篇关于MySQL生成雪花算法ID的实现示例的文章就介绍到这了,更多相关MySQL生成雪花算法ID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文