此工具类用于生成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的更多相关文章

  1. 随机生成一串字符串(java)

    该随笔为开发笔记 今天在公司接手了一个项目,在看该项目老代码时,发现上一位大佬写的随机取一串字符串还不错,在此做一次开发笔记 在他的基础上我做了点改动,但是原理一样 /** * 随机取一段字符串方法1 ...

  2. Golang 和 Python 随机生成N位字符串

    Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...

  3. PHP 小方法之 随机生成几位字符串

    if(! function_exists ('get_rand_string') ) { function get_rand_string($len=6,$format='ALL') { switch ...

  4. Mybatis-Plus默认主键策略导致自动生成19位长度主键id的坑

    原创/朱季谦 某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自增,但页面新增功能生成的数据主键id很诡异,长度达到了19位,且不是从1开始递增的-- 我检查了一下,发 ...

  5. Java通过UUID随机生成36位、32位唯一识别码(唯一字符串)

    import java.util.UUID; /** * 通过UUID随机生成36位.32位唯一识别码(唯一字符串) * @author [J.H] * */ public class Test { ...

  6. Java生成MD5加密字符串代码实例

    这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下   (1)一般使用的数据库中都会保存用 ...

  7. java工具类(三)之生成若干位随机数

    java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示.因为要求最后是一个4位的整数,不带小数点.当时就 ...

  8. java 随机生成6位短信验证码

    生成6位随机数字其实很简单,只需一行代码,具体如下: String verifyCode = String.valueOf(new Random().nextInt(899999) + 100000) ...

  9. java 随机生成4位随机数

    java 随机生成4位的随机数测试类 @org.junit.Testpublic void testRandom(){ String msg="您的注册码为%s,谢谢注册!"; S ...

随机推荐

  1. 浅谈对git的认识

    在上大二之前我根本不知道git是什么,根本不知道它有什么功能,以及应用于那个领域,那天老师说让我们了解一些它,并对其进行一下学习.我瞬间就蒙了,但是我并没有把其抛在脑后,而是通过在其它方式,对其进行了 ...

  2. ngcordova 监控网络制式改变

    ngcordova 监控网络制式改变 keywords cordova,phonegap,ionic,network,网络制式 API参考 http://ngcordova.com/docs/plug ...

  3. 【BZOJ】【1053】【HAOI2007】反素数ant

    搜索 经典搜索题目(其实是蒟蒻只会搜……vfleaking好像有更优秀的做法?) 枚举质数的幂,其实深度没多大……因为$2^32$就超过N了……而且质数不能取的太大,所以不会爆…… /******** ...

  4. GameMap(类结构)(不断跟新)

    暂时有个疑问为什么这些需要这么复杂的继承

  5. JS数组2(冒泡排列、数组里面查找数据)

    数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...

  6. HDU1014Uniform Generator

    Uniform Generator Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   ...

  7. display:inline-block 在IE6中实现{转}

    IE6/IE7下对display:inline-block的支持性不好. 1.inline元素的display属性设置为inline-block时,所有的浏览器都支持: 2.block元素的displ ...

  8. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  9. 用 VIPER 构建 iOS 应用架构(2)

    [编者按]本篇文章由 Jeff Gilbert 和 Conrad Stoll 共同编写,通过构建一个基础示例应用,深入了解 VIPER,并从视图.交互器等多个部件理清 VIPER 的整体布局及思路.通 ...

  10. C#&java重学笔记(泛型)

    C#部分: 1.泛型的出现主要用于解决类.接口.委托.方法的通用性,通过定义泛型类.接口.委托.方法,可以让不同类型的数据使用相同运算规则处理数据,方便了开发. 2.利用System.Nullable ...