此工具类用于生成24位字符串ID,唯一不重复。
直接通过 IdGenerator.get() 获取。

源码如下:(点击下载源码 - IdGenerator.java )

  1. import java.net.NetworkInterface;
  2. import java.nio.ByteBuffer;
  3. import java.nio.ByteOrder;
  4. import java.util.Enumeration;
  5.  
  6. /**
  7. * 生成24位字符串ID
  8. *
  9. */
  10. public class IdGenerator implements Comparable<IdGenerator> {
  11.  
  12. /**
  13. * 调用该方法获取24位字符串ID
  14. * @return
  15. */
  16. public static String get() {
  17. return new IdGenerator().toString();
  18. }
  19.  
  20. public IdGenerator() {
  21. _time = _gentime;
  22. _machine = _genmachine;
  23. synchronized (_incLock) {
  24. _inc = _nextInc++;
  25. }
  26. _new = true;
  27. }
  28.  
  29. public int hashCode() {
  30. return _inc;
  31. }
  32.  
  33. public String toStringMongod() {
  34. byte b[] = toByteArray();
  35.  
  36. StringBuilder buf = new StringBuilder(24);
  37.  
  38. for (int i = 0; i < b.length; i++) {
  39. int x = b[i] & 0xFF;
  40. String s = Integer.toHexString(x);
  41. if (s.length() == 1)
  42. buf.append("0");
  43. buf.append(s);
  44. }
  45.  
  46. return buf.toString();
  47. }
  48.  
  49. public byte[] toByteArray() {
  50. byte b[] = new byte[12];
  51. ByteBuffer bb = ByteBuffer.wrap(b);
  52. bb.putInt(_inc);
  53. bb.putInt(_machine);
  54. bb.putInt(_time);
  55. reverse(b);
  56. return b;
  57. }
  58.  
  59. static void reverse(byte[] b) {
  60. for (int i = 0; i < b.length / 2; i++) {
  61. byte t = b[i];
  62. b[i] = b[b.length - (i + 1)];
  63. b[b.length - (i + 1)] = t;
  64. }
  65. }
  66.  
  67. static String _pos(String s, int p) {
  68. return s.substring(p * 2, (p * 2) + 2);
  69. }
  70.  
  71. public String toString() {
  72. return toStringMongod();
  73. }
  74.  
  75. public int compareTo(IdGenerator id) {
  76. if (id == null)
  77. return -1;
  78.  
  79. long xx = id.getTime() - getTime();
  80. if (xx > 0)
  81. return -1;
  82. else if (xx < 0)
  83. return 1;
  84.  
  85. int x = id._machine - _machine;
  86. if (x != 0)
  87. return -x;
  88.  
  89. x = id._inc - _inc;
  90. if (x != 0)
  91. return -x;
  92.  
  93. return 0;
  94. }
  95.  
  96. public int getMachine() {
  97. return _machine;
  98. }
  99.  
  100. public long getTime() {
  101. long z = _flip(_time);
  102. return z * 1000;
  103. }
  104.  
  105. public int getInc() {
  106. return _inc;
  107. }
  108.  
  109. final int _time;
  110. final int _machine;
  111. final int _inc;
  112.  
  113. boolean _new;
  114.  
  115. static int _flip(int x) {
  116. byte b[] = new byte[4];
  117. ByteBuffer bb = ByteBuffer.wrap(b);
  118. bb.order(ByteOrder.LITTLE_ENDIAN);
  119. bb.putInt(x);
  120. bb.flip();
  121. bb.order(ByteOrder.BIG_ENDIAN);
  122. return bb.getInt();
  123. }
  124.  
  125. private static int _nextInc = (new java.util.Random()).nextInt();
  126. private static final String _incLock = new String("IdGenerator._incLock");
  127.  
  128. private static int _gentime = _flip((int) (System.currentTimeMillis() / 1000));
  129.  
  130. static final Thread _timeFixer;
  131. private static final int _genmachine;
  132. static {
  133. try {
  134. final int machinePiece;
  135. {
  136. StringBuilder sb = new StringBuilder();
  137. Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
  138. while (e.hasMoreElements()) {
  139. NetworkInterface ni = e.nextElement();
  140. sb.append(ni.toString());
  141. }
  142. machinePiece = sb.toString().hashCode() << 16;
  143. }
  144.  
  145. final int processPiece = java.lang.management.ManagementFactory.getRuntimeMXBean().getName().hashCode() & 0xFFFF;
  146. _genmachine = machinePiece | processPiece;
  147. } catch (java.io.IOException ioe) {
  148. throw new RuntimeException(ioe);
  149. }
  150.  
  151. _timeFixer = new Thread("IdGenerator-TimeFixer") {
  152. public void run() {
  153. while (true) {
  154. try {
  155. Thread.sleep(499);
  156. } catch (InterruptedException e) {
  157. }
  158. _gentime = _flip((int) (System.currentTimeMillis() / 1000));
  159. }
  160. }
  161. };
  162. _timeFixer.setDaemon(true);
  163. _timeFixer.start();
  164. }
  165.  
  166. }

生成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. 如何用myeclispe远程调试tomcat

    如何用myeclispe远程调试tomcat 在工作开发中,通常用本机进行代码编写,然后将编好的工程部署到测试服务器进行测试.往往测试服务器并不是自己的本机,因此对调试带来众多不便.今天学习可以用my ...

  2. IEEE 802.11 标准列表

    IEEE 802.11 标准列表 IEEE 802.11,1997年,原始标准(2Mbit/s,播在2.4GHz). IEEE 802.11a,1999年,物理层补充(54Mbit/s,播在5GHz) ...

  3. C#--简单的串口通信程序

    前几天做毕业设计,其中要用到串口和下位机进行通信,于是自己捣鼓了一个简单的串口通信程序. 在做通信之前要先弄一个SerialPort组件出来,当然也可以通过程序来创建.本次设计中采用的是拖的winfo ...

  4. TEST ON 平安夜

    1.前言 = = 感觉自己其实没发过关于考试的博客过... 今天是一个平安的夜晚,漆黑的夜被霓虹划分成网络,很适合发题. 2.num9九数码问题 传统8数码改一下...只询问一个状态,所以很容易搞,正 ...

  5. Poj 1032 分类: Translation Mode 2014-04-04 09:09 111人阅读 评论(0) 收藏

    Parliament Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16521   Accepted: 6975 Descr ...

  6. NYOJ-205 求余数 AC 分类: NYOJ 2014-02-02 12:30 201人阅读 评论(0) 收藏

    这题目看一眼以为难度评级出错了,只是一个求余数的题目,,后来才发现,位数小于百万位,,,我还以为是大小小于百万呢,所以借鉴了另一大神的代码, 用大数,重点是同余定理: (a+b)mod m=((a m ...

  7. 【转载】c/c++在windows下获取时间和计算时间差的几种方法总结

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

  8. Oracle NULL 和空值

      如果你工作中用到了Oracle,你必须要留意NULL和空值的处理与SQL Server上的不同.现在让我们看些例子. 建立这张数据库表并插入记录 CREATE TABLE TestNull(Col ...

  9. [转]日期格式化(yyyy-MM-dd)中,为什么 M 多大写?

    最近犯了个可傻逼的错误,格式化年月日的时候不小心将yyyy-MM-dd写成YYYY-MM-dd,导致格式化结果中年不正确. 看看知乎上的说法 问题: http://www.zhihu.com/ques ...

  10. ASP.NET制作一个简单的等待窗口

    前一阵做一个项目,在处理报表的时候时间偏长,客户提出要做出一个等待窗口提示用户等待(页面太久没反映,用户还以为死了呢).在分析这一需求之后,觉得如果要实现像winform应用中的processbar太 ...