对于程序猿来说,大家肯定知道UUID,但它由于采用无意义字符串,没有排序,数据量大时查询效率比较低。于是就有了雪花,每一片雪花都拥有自己漂亮独特的形状、独一无二。雪花算法也表示生成的ID如雪花般独一无二。
![3ace18cd98aeeb2e8750ea1ddcceff9d.png](https://i-blog.csdnimg.cn/blog_migrate/61ae5cf84138d827cdc45812ca3933f8.jpeg)
雪花算法生成的ID是纯数字且具有时间顺序的,自增、有序、适合分布式场景
。其原始版本是scala版,后面出现了许多其他语言的版本如Java、C++等。
大致由:首位无效符、时间戳差值,机器(进程)编码,序列号四部分组成。
其特点是自增、有序、纯数字组成查询效率高且不依赖于数据库。适合在分布式的场景中应用,可根据需求调整具体实现。
时间位:可以根据时间进行排序,有助于提高查询速度。
机器id位:适用于分布式环境下对多节点的各个节点进行标识,可以具体根据节点数和部署情况设计划分机器位10位长度,如划分5位表示进程位等。
序列号位:是一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号,snowflake算法可以根据项目情况以及自身需要进行一定的修改。
![c3624845edc14d95a392b7d7fcba6fd0.png](https://i-blog.csdnimg.cn/blog_migrate/1c71ead591601002e3aa419b624f74e8.jpeg)
但万物都有缺点,雪花算法也一样,雪花算法在单机系统上ID是递增的,但是在分布式系统多节点的情况下,所有节点的时钟并不能保证不完全同步,所以有可能会出现不是全局递增的情况。
好了就到这里,回见了您!下张介绍具体实现