生成主键的工具类

  1 public class UNIDGenerate {
  2
  3     private static final int IP;
  4
  5     static {
  6         int ipadd;
  7         try {
  8             ipadd = toInt(InetAddress.getLocalHost().getAddress());
  9         } catch (Exception e) {
 10             ipadd = 0;
 11         }
 12         IP = ipadd;
 13     }
 14
 15     private static short counter = (short) 0;
 16
 17     private static final int JVM = (int) (System.currentTimeMillis() >>> 8);
 18
 19     private String sep = "";
 20
 21     /**
 22      * 从java 的虚拟机计算出一个值 Unique across JVMs on this machine (unless they load
 23      * this class in the same quater second - very unlikely)
 24      */
 25     protected int getJVM() {
 26         return JVM;
 27     }
 28
 29     /**
 30      * 在一个毫秒单位里的唯一整数值 Unique in a millisecond for this JVM instance (unless
 31      * there are > Short.MAX_VALUE instances created in a millisecond)
 32      */
 33     protected short getCount() {
 34         synchronized (UNIDGenerate.class) {
 35             if (counter < 0)
 36                 counter = 0;
 37             return counter++;
 38         }
 39     }
 40
 41     /**
 42      * 局域网唯一IP地址 Unique in a local network
 43      */
 44     protected int getIP() {
 45         return IP;
 46     }
 47
 48     /**
 49      * Unique down to millisecond
 50      */
 51     protected short getHiTime() {
 52         return (short) (System.currentTimeMillis() >>> 32);
 53     }
 54
 55     protected int getLoTime() {
 56         return (int) System.currentTimeMillis();
 57     }
 58
 59     protected String format(int intval) {
 60         String formatted = Integer.toHexString(intval);
 61         StringBuffer buf = new StringBuffer("00000000");
 62         buf.replace(8 - formatted.length(), 8, formatted);
 63         return buf.toString();
 64     }
 65
 66     protected String format(short shortval) {
 67         String formatted = Integer.toHexString(shortval);
 68         StringBuffer buf = new StringBuffer("0000");
 69         buf.replace(4 - formatted.length(), 4, formatted);
 70         return buf.toString();
 71     }
 72
 73     /**
 74      * 返回生成的unid
 75      *
 76      * @return String-unid值
 77      */
 78     public String toString() {
 79         StringBuffer sb = new StringBuffer(36).append(format(getIP())).append(
 80                 sep).append(format(getJVM())).append(sep).append(
 81                 format(getHiTime())).append(sep).append(format(getLoTime()))
 82                 .append(sep).append(format(getCount()));
 83         MessageDigest md5 = null;
 84         try {
 85             md5 = MessageDigest.getInstance("MD5");
 86         } catch (NoSuchAlgorithmException e) {
 87             return sb.toString().toUpperCase();
 88         }
 89         md5.update(sb.toString().getBytes());
 90         byte[] array = md5.digest();
 91         StringBuffer ret = new StringBuffer();
 92         for (int j = 0; j < array.length; ++j) {
 93             int b = array[j] & 0xFF;
 94             if (b < 0x10)
 95                 ret.append(‘0‘);
 96             ret.append(Integer.toHexString(b));
 97         }
 98         return ret.toString().toUpperCase();
 99     }
100
101     /**
102      * 返回生成的unid
103      *
104      * @return String-unid值
105      */
106     public String getUnid() {
107         return toString();
108     }
109
110     /**
111      * 判断输入的字符串是否为32位Unid
112      *
113      * @param str
114      *            输入字符串
115      * @return 若是32位Unid,则返回True,否则返回False
116      */
117     public static boolean isUnid(String str) {
118         if (str.length() == 32 && str.matches("[A-Z0-9]{32}")) {
119             return true;
120         }
121         return false;
122     }
123
124     public static int toInt(byte[] bytes) {
125         int result = 0;
126         for (int i = 0; i < 4; i++) {
127             result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
128         }
129         return result;
130     }
131 }
时间: 2024-10-14 05:28:15

生成主键的工具类的相关文章

ORACLE uuid自动生成主键

-- Create table create table TECHNOLOGYCOMPANY ( ID VARCHAR2(32) default SYS_GUID() not null, FLOWID VARCHAR2(50), CONPANYID NUMBER, ISCOMMUNICATION VARCHAR2(10) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1

多线程调用生成主键流水号存储过程产生主键冲突问题解决方案

遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用Procedure_insert Procedure_insert Begin Call procedure(获取流水号) Insert into table values(流水号作为id,其他列); End 流水号存储过程: Update 统计表 统计字段+1 Update 统计表 最终流水号 s

Mycat探索之旅(4)----Mycat的自增长主键和返回生成主键ID的实现

说明:MyCAT自增长主键和返回生成主键ID的实现 1) mysql本身对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0:这里做一个简单的测试 创建测试表 -------------------------------------- --创建测试表 ------------------------------------- USE test; CREATE TABLE IF NOT EXISTS t_auto_increment ( id INT NOT NULL

生成二维码工具类

生成二维码工具类: public Bitmap CreateTwoDCode(String content) throws Exception { // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败 BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300, 300); int width = matrix.getWidth(); int hei

java UUID.randomUUID()自动生成主键作为Id或文件路径

UUID.randomUUID().toString()是javaJDK(1.5以上的版本)提供的一个自动生成主键的方法,它生成的是以为32位的数字和字母组合的字符,中间还参杂着4个 - 符号. 作用:它可以作为我们表的标识列来增加,比序列增长更加方便.当然还可以用来拼接作为路径,或者图片的前缀名等等. 使用原因: 文件命名或者其他使用时间命名对于高并发会存在风险,使用UUID会规避风险, import java.util.UUID: UUID.randomUUID().toString():

hibernnate 使用Oracle的sequence为对象生成主键 自增50的问题

前段时间在做一个SSH的项目,使用Oracle中的sequence作为对象表的主键生成策略,在数据库中已经配置好了sequence的步长为1,可是在运行测试时,发现主键ID每次增加的步长是50. 奇怪之余Google一下,找到如下的解决方案,在对实体类的ID进行注解时,加上一句"allocationSize=1",例如对表EL的主键配置了一个序列叫"EL_SEQ",那么在getId方法上面使用如下注解即可解决. @SequenceGenerator(name=&qu

ibatis实战之插入数据(自动生成主键)

--------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert>元素的一个专用子元素)来获取这些自动生成的主键的值并将其保存在对象中.完成这项工作可以有两种方式,具体选择何种方式由你所使用的具体的主键生成技术来确定. 第一种方式是,当你把记录插入到数据库中并且数据库为该记录自动生成了主键值之后,就立即抓取该键值.此时要注意的是,必须确保所使用的数据库驱动程序确实能返回你执行上一条insert语句所得到的键值.

DAO以及获取自动生成主键值

package com.alibaba.sql; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.A

mybatis自动生成主键

mysql,使用useGeneratedKey属性: <insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">     INSERT INTO STUDENTS(NAME, EMAIL, PHONE)     VALUES(#{name},#{email},#{phone}) &l