https://blog.csdn.net/guodongcc322/article/details/55211273

https://blog.csdn.net/weixin_36751895/article/details/70331781

https://blog.csdn.net/antony9118/article/details/52766848

package com.witwicke.picturematerial.utils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; /**
* ClassName:IdGenerator <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2017年2月17日 下午3:08:34 <br/>
*
* @author chiwei
* @see
* @since JDK 1.6
*/
public class IdGenerator {
/**
* SnowFlake算法 64位Long类型生成唯一ID 第一位0,表明正数 2-42,41位,表示毫秒时间戳差值,起始值自定义
* 43-52,10位,机器编号,5位数据中心编号,5位进程编号 53-64,12位,毫秒内计数器 本机内存生成,性能高
* <p>
* 主要就是三部分: 时间戳,进程id,序列号 时间戳41,id10位,序列号12位
*
* @author chiwei sd
* @param args sd
* @since JDK 1.6 sd
*/ private final static long beginTs = 1483200000000L; private long lastTs = 0L; private long processId;
private int processIdBits = 10; private long sequence = 0L;
private int sequenceBits = 12; // 10位进程ID标识
public IdGenerator(long processId) {
if (processId > ((1 << processIdBits) - 1)) {
throw new RuntimeException("进程ID超出范围,设置位数" + processIdBits + ",最大"
+ ((1 << processIdBits) - 1));
}
this.processId = processId;
} protected long timeGen() {
return System.currentTimeMillis();
} public synchronized long nextId() {
long ts = timeGen();
if (ts < lastTs) {// 刚刚生成的时间戳比上次的时间戳还小,出错
throw new RuntimeException("时间戳顺序错误");
}
if (ts == lastTs) {// 刚刚生成的时间戳跟上次的时间戳一样,则需要生成一个sequence序列号
// sequence循环自增
sequence = (sequence + 1) & ((1 << sequenceBits) - 1);
// 如果sequence=0则需要重新生成时间戳
if (sequence == 0) {
// 且必须保证时间戳序列往后
ts = nextTs(lastTs);
}
} else {// 如果ts>lastTs,时间戳序列已经不同了,此时可以不必生成sequence了,直接取0
sequence = 0L;
}
lastTs = ts;// 更新lastTs时间戳
return ((ts - beginTs) << (processIdBits + sequenceBits)) | (processId << sequenceBits)
| sequence;
} protected long nextTs(long lastTs) {
long ts = timeGen();
while (ts <= lastTs) {
ts = timeGen();
}
return ts;
} public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// IdGenerator ig = new IdGenerator(1023);
// String str = "20180329";
// System.out.println(new SimpleDateFormat("YYYYMMDD").parse(str).getTime());
// Set<Long> set = new HashSet<Long>();
// long begin = System.nanoTime();
// for (int i = 0; i < 10; i++) {
// set.add(ig.nextId());
// }
// System.out.println("time=" + (System.nanoTime() - begin) / 1000.0 + " us");
// System.out.println(set.size());
// System.out.println(set); List<Long> idlist = new ArrayList<Long>();
IdGenerator ig = new IdGenerator(1023);
for (int i = 0; i < 10; i++) {
long id = ig.nextId();
idlist.add(id);
}
System.out.println(idlist);
}
}

  

spring 项目启动时,实例化id自动生成类,之后调用 nextid()生成不重复的id;

唯一id算法的更多相关文章

  1. 唯一ID算法之:snowflake(Java版本)

    Twitter开源的算法,简单易用. /** * Twitter_Snowflake<br> * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000 ...

  2. PHP使用SnowFlake算法生成唯一ID

    前言:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的.文章的详情页URL想要做成url伪静态的格式即xxx.html 其中xxx考虑过 ...

  3. 分布式唯一id:snowflake算法思考

    匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...

  4. PHP算法学习(1) 全局唯一ID

    2019年1月8日16:11:13 svn地址:svn://gitee.com/zxadmin/live_z    代码在code里面 全局唯一ID 生产 后续会添加其他方法 <?php /* ...

  5. 分布式系统-主键唯一id,订单编号生成-雪花算法-SnowFlake

    分布式系统下 我们每台设备(分布式系统-独立的应用空间-或者docker环境) * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作 ...

  6. 分布式系统的唯一id生成算法你了解吗?

    在分库分表之后你必然要面对的一个问题,就是id咋生成? 因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊. 举个例子,你的订单表拆分为了1024张订单表,每个表的id都从 ...

  7. 根据twitter的snowflake算法生成唯一ID

    C#版本 /// <summary> /// 根据twitter的snowflake算法生成唯一ID /// snowflake算法 64 位 /// 0---0000000000 000 ...

  8. 全局唯一Id:雪花算法

    雪花算法-snowflake 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有 ...

  9. C# 根据twitter的snowflake算法生成唯一ID

    C# 版算法: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

随机推荐

  1. ansible 学习记录

    Ansible 的重新学习记录 这里我的Ansible的宿主机是centos 7.2系统,这里我通过yum 安装Ansible 1.配置epel源 sudo yum -y install epel-r ...

  2. centos 7部署graphite(nginx+uwsgi)

    http://www.debugrun.com/a/o5qyP9W.htmlhttp://blog.csdn.net/tsingfu1986/article/details/44239503 http ...

  3. xcode自动打ipa包脚本 资料

    http://webfrogs.me/2012/09/19/buildipa/ http://blog.csdn.net/baxiaxx/article/details/8267295 http:// ...

  4. ConEmu配置task的脚本

    1.Bash::Msys2-64 set CHERE_INVOKING= & set .exe -new_console:p %ConEmuDrive%\msys64\usr\bin\bash ...

  5. [tools]hugo&github构建静态网站/百度统计

    hugo/github构建网站基本原理 1.hugo是一个静态化的工具,你写md,然后他把md转换成对应样式的html, 2.并给html嵌入百度统计的script.然后你将html放到github上 ...

  6. 智能引导式报错(Class file name must end with .class)

    转自:http://blog.sina.com.cn/s/blog_8e761c110101dyj3.html 在使用Eclipse时,有时会出现这样的错误,在使用智能引导式会报错An interna ...

  7. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  8. 菜鸟学Java(四)——JSP内置对象

    学习JavaWeb就离不开JSP,而学习JSP又不得不了解它常用的九个内置对象.今天来做一个简单介绍. request Request封装了用户提交的信息,通过调用Request相应的方法可以获取封装 ...

  9. C++中的typedef typename 作用

    今天在代码里看到了这样一段代码: typedef typename RefBase::weakref_type weakref_type; 起初一直搞不懂为什么要加个typename,后来搜索了一下才 ...

  10. Virtual Memory$$memory-mapped-files

    Virtual Memory http://csapp.cs.cmu.edu/2e/ch9-preview.pdf https://howtodoinjava.com/java-7/nio/java- ...