最近看了一下hibernate的uuid算法,感觉可读性很强的,于是提取出来(jdk uuid的源码看着头疼)
package com.ec.test;
import java.io.Serializable;
import java.net.InetAddress;
public class HibernateUUId {
private String sep = "-";
/**
* @param 通过处理Ip得到的整数值
*/
private static final int IP;
static {
int ipadd;
try {
ipadd = toInt( InetAddress.getLocalHost().getAddress() );
}
catch (Exception e) {
ipadd = 0;
}
IP = ipadd;
}
private static short counter = (short) 0;
private static final int JVM = (int) ( System.currentTimeMillis() >>> 8 );
/**
* 或得该类加载时jvm的时间唯一的(除非加载该类在相同德四分之一秒-几乎不可能)
* Unique across JVMs on this machine (unless they load this class
* in the same quater second - very unlikely)
*/
protected int getJVM() {
return JVM;
}
/**
* Unique in a millisecond for this JVM instance (unless there
* are > Short.MAX_VALUE instances created in a millisecond)
*/
protected short getCount() {
synchronized(HibernateUUId.class) {
if (counter<0) counter=0;
return counter++;
}
}
/**
* Unique in a local network
*/
protected int getIP() {
return IP;
}
/**
* Unique down to millisecond
*/
protected short getHiTime() {
return (short) ( System.currentTimeMillis() >>> 32 );
}
protected int getLoTime() {
return (int) System.currentTimeMillis();
}
public Serializable generate() {
return new StringBuffer( 36 )
.append( format( getIP() ) ).append( sep )
.append( format( getJVM() ) ).append( sep )
.append( format( getHiTime() ) ).append( sep )
.append( format( getLoTime() ) ).append( sep )
.append( format( getCount() ) )
.toString();
}
protected String format(int intValue) {
String formatted = Integer.toHexString( intValue );
StringBuffer buf = new StringBuffer( "00000000" );
buf.replace( 8 - formatted.length(), 8, formatted );
return buf.toString();
}
protected String format(short shortValue) {
String formatted = Integer.toHexString( shortValue );
StringBuffer buf = new StringBuffer( "0000" );
buf.replace( 4 - formatted.length(), 4, formatted );
return buf.toString();
}
public static int toInt(byte[] bytes) {
int result = 0;
//将result每次乘256 -128+ bytes[i]
for ( int i = 0; i < 4; i++ ) {
result = ( result << 8 ) - Byte.MIN_VALUE + (int) bytes[i];
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new HibernateUUId().generate());
}
}
分享到:
相关推荐
### 使用Hibernate形式生成UUID的算法解析 在Java开发领域,特别是使用Hibernate框架进行数据库操作时,唯一标识符(UUID)的生成是常见的需求之一。UUID(Universally Unique Identifier),即通用唯一识别码,是...
最后,“Basic O/R Mapping”章节详细阐述了ORM映射的基本声明,如Doctype、EntityResolver、hibernate-mapping、class元素、id元素及其子元素Generator、Hi/lo算法、UUID算法等。这些细节是实现高效、灵活的对象...
- **5.1.4.3 UUID算法(UUIDAlgorithm)** - 解释UUID算法的特点及其使用场景。 - **5.1.4.4 标识字段和序列(IdentitycolumnsandSequences)** - 介绍如何使用数据库自增字段或序列作为主键。 - **5.1.4.5 ...
- **5.1.4.3 UUID 算法** UUID (通用唯一标识符) 是一种生成全局唯一 ID 的方法,适合于分布式系统。 #### 结语 以上内容涵盖了 Hibernate 的入门、进阶和高级主题,旨在帮助开发者全面掌握 Hibernate 的使用...
id 算法可以是整型自增、sql server 等数据库的 identity、Oracle 的 sequence、hilo(高低位)算法、uuid、guid、程序赋值等。复合主键可以组合多个列来唯一标识一个对象。数据版本并发性控制可以使用版本、时间戳...
主键生成策略还有多种方式,如`Assigned`(由外部程序负责),`Increment`(每次自增1,适用于MySQL),`Uuid`(生成UUID字符串),以及`Hilo`(高效ID生成算法)。选择哪种策略取决于具体需求和数据库类型。 ...
2. **主键生成策略**:支持多种主键生成方式,如自增(Identity)、序列(Sequence)、高/低算法(Hi/Lo Algorithm)、UUID算法等。 3. **复合主键**:当需要使用多个字段作为主键时,可以使用composite-id元素。 4....
- `uuid.hex`、`uuid.string`:生成128位UUID,前者以16进制字符串表示,后者是未编码的UUID。 - `foreign`:使用关联表的字段作为主键。 8. `name`:指定持久化类的全限定名,如果不指定,Hibernate会认为这是一...
- 使用128位UUID算法生成字符串类型的标识符。 - 具有全局唯一性。 #### 四、联合主键 在Hibernate中,可以使用复合主键来表示具有多个字段作为主键的实体。以下是一种定义复合主键的方法: ```xml ...
7. UUID(Universally Unique Identifier)生成器:Hibernate 提供了两种 UUID 生成器,`uuid.hex` 和 `uuid.string`。这两种生成器使用 128 位的 UUID 算法,生成全局唯一的标识符。`uuid.hex` 生成的是 32 位的...
- **UUID 算法**:生成全局唯一标识符。 - **Identity 列和序列**:利用数据库自身的机制生成主键。 以上是对 Hibernate 3.1.2 英文文档的部分内容解析,涉及了架构、配置和基本映射的关键概念。深入理解这些知识...
例如,id元素用于指定主键,generator子元素定义主键生成策略,如Hi/Lo算法、UUID算法等。此外,还可以映射one-to-one、many-to-one、one-to-many、many-to-many等关系。 5. **Hibernate的类型**:Hibernate支持...
【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...
- `uuid.hex`和`uuid.string`: 生成128位UUID的16进制或非编码版本。 - `foreign`: 使用关联对象的ID作为主键。 - 可自定义主键生成策略,扩展Hibernate类。 2. **普通属性(property)配置**: - `property`...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的...
- UUID 算法:使用 UUID 作为主键。 通过上述内容可以看出,Hibernate 是一款非常强大的 ORM (Object Relational Mapping) 工具,它能够简化 Java 应用与数据库交互的过程。无论是简单的 CRUD 操作还是复杂的事务...
其中,关于主键生成策略的讨论,如Hi/Lo算法、UUID算法和自动增长列的处理,为开发者提供了多种选择,以适应不同的场景需求。 综上所述,《hibernate-reference-3.1.1.pdf》不仅是一份技术手册,更是Hibernate...