生成24位字符串ID__IdGenerator.java
此工具类用于生成24位字符串ID,唯一不重复。
直接通过 IdGenerator.get() 获取。
源码如下:(点击下载源码 - IdGenerator.java )
- import java.net.NetworkInterface;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.util.Enumeration;
- /**
- * 生成24位字符串ID
- *
- */
- public class IdGenerator implements Comparable<IdGenerator> {
- /**
- * 调用该方法获取24位字符串ID
- * @return
- */
- public static String get() {
- return new IdGenerator().toString();
- }
- public IdGenerator() {
- _time = _gentime;
- _machine = _genmachine;
- synchronized (_incLock) {
- _inc = _nextInc++;
- }
- _new = true;
- }
- public int hashCode() {
- return _inc;
- }
- public String toStringMongod() {
- byte b[] = toByteArray();
- StringBuilder buf = new StringBuilder(24);
- for (int i = 0; i < b.length; i++) {
- int x = b[i] & 0xFF;
- String s = Integer.toHexString(x);
- if (s.length() == 1)
- buf.append("0");
- buf.append(s);
- }
- return buf.toString();
- }
- public byte[] toByteArray() {
- byte b[] = new byte[12];
- ByteBuffer bb = ByteBuffer.wrap(b);
- bb.putInt(_inc);
- bb.putInt(_machine);
- bb.putInt(_time);
- reverse(b);
- return b;
- }
- static void reverse(byte[] b) {
- for (int i = 0; i < b.length / 2; i++) {
- byte t = b[i];
- b[i] = b[b.length - (i + 1)];
- b[b.length - (i + 1)] = t;
- }
- }
- static String _pos(String s, int p) {
- return s.substring(p * 2, (p * 2) + 2);
- }
- public String toString() {
- return toStringMongod();
- }
- public int compareTo(IdGenerator id) {
- if (id == null)
- return -1;
- long xx = id.getTime() - getTime();
- if (xx > 0)
- return -1;
- else if (xx < 0)
- return 1;
- int x = id._machine - _machine;
- if (x != 0)
- return -x;
- x = id._inc - _inc;
- if (x != 0)
- return -x;
- return 0;
- }
- public int getMachine() {
- return _machine;
- }
- public long getTime() {
- long z = _flip(_time);
- return z * 1000;
- }
- public int getInc() {
- return _inc;
- }
- final int _time;
- final int _machine;
- final int _inc;
- boolean _new;
- static int _flip(int x) {
- byte b[] = new byte[4];
- ByteBuffer bb = ByteBuffer.wrap(b);
- bb.order(ByteOrder.LITTLE_ENDIAN);
- bb.putInt(x);
- bb.flip();
- bb.order(ByteOrder.BIG_ENDIAN);
- return bb.getInt();
- }
- private static int _nextInc = (new java.util.Random()).nextInt();
- private static final String _incLock = new String("IdGenerator._incLock");
- private static int _gentime = _flip((int) (System.currentTimeMillis() / 1000));
- static final Thread _timeFixer;
- private static final int _genmachine;
- static {
- try {
- final int machinePiece;
- {
- StringBuilder sb = new StringBuilder();
- Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
- while (e.hasMoreElements()) {
- NetworkInterface ni = e.nextElement();
- sb.append(ni.toString());
- }
- machinePiece = sb.toString().hashCode() << 16;
- }
- final int processPiece = java.lang.management.ManagementFactory.getRuntimeMXBean().getName().hashCode() & 0xFFFF;
- _genmachine = machinePiece | processPiece;
- } catch (java.io.IOException ioe) {
- throw new RuntimeException(ioe);
- }
- _timeFixer = new Thread("IdGenerator-TimeFixer") {
- public void run() {
- while (true) {
- try {
- Thread.sleep(499);
- } catch (InterruptedException e) {
- }
- _gentime = _flip((int) (System.currentTimeMillis() / 1000));
- }
- }
- };
- _timeFixer.setDaemon(true);
- _timeFixer.start();
- }
- }
生成24位字符串ID__IdGenerator.java的更多相关文章
- 随机生成一串字符串(java)
该随笔为开发笔记 今天在公司接手了一个项目,在看该项目老代码时,发现上一位大佬写的随机取一串字符串还不错,在此做一次开发笔记 在他的基础上我做了点改动,但是原理一样 /** * 随机取一段字符串方法1 ...
- Golang 和 Python 随机生成N位字符串
Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...
- PHP 小方法之 随机生成几位字符串
if(! function_exists ('get_rand_string') ) { function get_rand_string($len=6,$format='ALL') { switch ...
- Mybatis-Plus默认主键策略导致自动生成19位长度主键id的坑
原创/朱季谦 某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自增,但页面新增功能生成的数据主键id很诡异,长度达到了19位,且不是从1开始递增的-- 我检查了一下,发 ...
- Java通过UUID随机生成36位、32位唯一识别码(唯一字符串)
import java.util.UUID; /** * 通过UUID随机生成36位.32位唯一识别码(唯一字符串) * @author [J.H] * */ public class Test { ...
- Java生成MD5加密字符串代码实例
这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下 (1)一般使用的数据库中都会保存用 ...
- java工具类(三)之生成若干位随机数
java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示.因为要求最后是一个4位的整数,不带小数点.当时就 ...
- java 随机生成6位短信验证码
生成6位随机数字其实很简单,只需一行代码,具体如下: String verifyCode = String.valueOf(new Random().nextInt(899999) + 100000) ...
- java 随机生成4位随机数
java 随机生成4位的随机数测试类 @org.junit.Testpublic void testRandom(){ String msg="您的注册码为%s,谢谢注册!"; S ...
随机推荐
- 如何用myeclispe远程调试tomcat
如何用myeclispe远程调试tomcat 在工作开发中,通常用本机进行代码编写,然后将编好的工程部署到测试服务器进行测试.往往测试服务器并不是自己的本机,因此对调试带来众多不便.今天学习可以用my ...
- IEEE 802.11 标准列表
IEEE 802.11 标准列表 IEEE 802.11,1997年,原始标准(2Mbit/s,播在2.4GHz). IEEE 802.11a,1999年,物理层补充(54Mbit/s,播在5GHz) ...
- C#--简单的串口通信程序
前几天做毕业设计,其中要用到串口和下位机进行通信,于是自己捣鼓了一个简单的串口通信程序. 在做通信之前要先弄一个SerialPort组件出来,当然也可以通过程序来创建.本次设计中采用的是拖的winfo ...
- TEST ON 平安夜
1.前言 = = 感觉自己其实没发过关于考试的博客过... 今天是一个平安的夜晚,漆黑的夜被霓虹划分成网络,很适合发题. 2.num9九数码问题 传统8数码改一下...只询问一个状态,所以很容易搞,正 ...
- Poj 1032 分类: Translation Mode 2014-04-04 09:09 111人阅读 评论(0) 收藏
Parliament Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16521 Accepted: 6975 Descr ...
- NYOJ-205 求余数 AC 分类: NYOJ 2014-02-02 12:30 201人阅读 评论(0) 收藏
这题目看一眼以为难度评级出错了,只是一个求余数的题目,,后来才发现,位数小于百万位,,,我还以为是大小小于百万呢,所以借鉴了另一大神的代码, 用大数,重点是同余定理: (a+b)mod m=((a m ...
- 【转载】c/c++在windows下获取时间和计算时间差的几种方法总结
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
- Oracle NULL 和空值
如果你工作中用到了Oracle,你必须要留意NULL和空值的处理与SQL Server上的不同.现在让我们看些例子. 建立这张数据库表并插入记录 CREATE TABLE TestNull(Col ...
- [转]日期格式化(yyyy-MM-dd)中,为什么 M 多大写?
最近犯了个可傻逼的错误,格式化年月日的时候不小心将yyyy-MM-dd写成YYYY-MM-dd,导致格式化结果中年不正确. 看看知乎上的说法 问题: http://www.zhihu.com/ques ...
- ASP.NET制作一个简单的等待窗口
前一阵做一个项目,在处理报表的时候时间偏长,客户提出要做出一个等待窗口提示用户等待(页面太久没反映,用户还以为死了呢).在分析这一需求之后,觉得如果要实现像winform应用中的processbar太 ...