雪花算法生成全局唯一ID

本文介绍了在系统设计中如何使用雪花算法生成全局唯一ID,以确保数据的唯一性。相较于数据库自增ID和PHP的uniqid()函数,雪花算法在高并发下能保证更低的重复率。该算法适用于64位PHP环境,尤其利于数据库索引和关联查询。文中提到了相关代码实现和参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

热烈推荐:超多IT资源,尽在798资源网

系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性。除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id。
百度了不少php相关的生成方式,得到的大多是随机字符串和内置的 uniqid()函数。不过经过 ab 测试,在并发情况下重复度是很高的。
偶然看到了一篇 Twitter的分布式自增ID算法 snowflake 的文章,得到的全局唯一都是纯数字。这一点对于数据库来说,在此列上创建索引并通过此字段关联查询的时候是比较好的。

需要值得注意的是:

snowflake的结构是64位的,所以需要在64位的PHP上运行。可以通过 phpinfo() 查看PHP的位数。一般 Linux 上的 PHP都可以满足。

下面是相关代码:

<?php
 
/***
 * Author:阿远
 * Class SnowflakeIdWorker
 */
class SnowflakeIdWorker{
 
    /** 开始时间截 (2018-01-01) */
    const twepoch = 1514736000000;
 
    /** 机器id所占的位数 */
    const workerIdBits = 10;
 
    //支持的最大机器id,结果是1023 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
    const maxWorkerId = (-1 ^ (-1 << self::workerIdBits));
 
    //序列在id中占的位数
    const sequenceBits = 12;
 
  
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值