生成24位字符串ID__IdGenerator.java

此工具类用于生成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 }
时间: 2024-12-25 12:07:41

生成24位字符串ID__IdGenerator.java的相关文章

随机生成32位字符串算法

随机生成32位字符串算法: function getRandom() { var arr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D"

java随机生成6位随机数 5位随机数 4位随机数

随机数,应用会相当广,验证数,订单号,流水号拼接. 下面是java随机数生成语句: 生成6位随机数(不会是5位或者7位,仅只有6位): System.out.println((int)((Math.random()*9+1)*100000)); 同理,生成5位随机数: System.out.println((int)((Math.random()*9+1)*10000)); 同理,生成4位随机数: System.out.println((int)((Math.random()*9+1)*1000

Java 生成32位随机字符编号

1 /** 2 * 生成32位编码 3 * @return string 4 */ 5 public static String getUUID(){ 6 String uuid = UUID.randomUUID().toString().trim().replaceAll("-", ""); 7 return uuid; 8 }

Java生成8位随机邀请码,不重复

public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",

随机生成4位验证码,由用户输入并验证是否输入正确,如果输入错误就生成新的验证码让用户重新输入,最多输入5次

1 //四位随机验证码 2 Random ran=new Random(); 3 String str1 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXUZ"; 4 char [] a=new char[4]; 5 for(int i=0;i<4;i++) 6 { 7 a[i]=str1.charAt(ran.nextInt(62)); 8 } 9 10 StringBuilder rzm1= new

DES加密解密字符串的JAVA实现(lp)

野火烧不尽,春风吹又生.众里寻他千百度,蓦然回首,那人却在灯火阑珊处.天作孽,犹可违,自作孽,不可活.山高月小,水落石出.晴川历历汉阳树,芳草萋萋鹦鹉洲. package test.des2.tt; /** * * 这个是真正实用的.修正了以前方法的只加密了前8位正确的bug. */ import java.security.*; import javax.crypto.*; public class DESPlus { private static String strDefaultKey =

微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://t.cn/SzjPjA 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场.估计很多朋友现在也正在使用. 看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个

MD5加密 生成32位md5码

package net.joystart.common.util.security; import java.security.MessageDigest; /** * 加密算法工具类 * @author LDY20151214 * */ public class EncryptionUtil { /*** * MD5加密 生成32位md5码 * @param 待加密字符串 * @return 返回32位md5码 */ public static String md5(String inStr)

利用时间戳生成8位不重复随机码

利用时间戳生成8位不重复随机码 更多0 时间戳 Java 16进制 随机码 时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)至当前时间的总秒数.由于时间都不会重复,所以利用时间来生成一串不重复的ID或字符串就非常方便. 思路:获取当前时间的时间戳,然后转换为十六进制. 生成结果如下: 当前时间:Mon May 13 14:47:51 CST 2013生成8位随机码:9ca52f20 相关代码: import java.util.Date; public class Test