`
davidxiaozhi
  • 浏览: 241450 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate uuid算法

阅读更多

最近看了一下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());
	}

}
 
0
1
分享到:
评论

相关推荐

    用hibernate形式uuid的生成算法

    ### 使用Hibernate形式生成UUID的算法解析 在Java开发领域,特别是使用Hibernate框架进行数据库操作时,唯一标识符(UUID)的生成是常见的需求之一。UUID(Universally Unique Identifier),即通用唯一识别码,是...

    Hibernate Reference

    最后,“Basic O/R Mapping”章节详细阐述了ORM映射的基本声明,如Doctype、EntityResolver、hibernate-mapping、class元素、id元素及其子元素Generator、Hi/lo算法、UUID算法等。这些细节是实现高效、灵活的对象...

    hibernate 3.2中文手册 中文文档

    - **5.1.4.3 UUID算法(UUIDAlgorithm)** - 解释UUID算法的特点及其使用场景。 - **5.1.4.4 标识字段和序列(IdentitycolumnsandSequences)** - 介绍如何使用数据库自增字段或序列作为主键。 - **5.1.4.5 ...

    hibernate_reference使用指南全

    - **5.1.4.3 UUID 算法** UUID (通用唯一标识符) 是一种生成全局唯一 ID 的方法,适合于分布式系统。 #### 结语 以上内容涵盖了 Hibernate 的入门、进阶和高级主题,旨在帮助开发者全面掌握 Hibernate 的使用...

    hibernate源码分析过程

    id 算法可以是整型自增、sql server 等数据库的 identity、Oracle 的 sequence、hilo(高低位)算法、uuid、guid、程序赋值等。复合主键可以组合多个列来唯一标识一个对象。数据版本并发性控制可以使用版本、时间戳...

    hibernate第一天笔记

    主键生成策略还有多种方式,如`Assigned`(由外部程序负责),`Increment`(每次自增1,适用于MySQL),`Uuid`(生成UUID字符串),以及`Hilo`(高效ID生成算法)。选择哪种策略取决于具体需求和数据库类型。 ...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    2. **主键生成策略**:支持多种主键生成方式,如自增(Identity)、序列(Sequence)、高/低算法(Hi/Lo Algorithm)、UUID算法等。 3. **复合主键**:当需要使用多个字段作为主键时,可以使用composite-id元素。 4....

    hibernate-mapping参数详解

    - `uuid.hex`、`uuid.string`:生成128位UUID,前者以16进制字符串表示,后者是未编码的UUID。 - `foreign`:使用关联表的字段作为主键。 8. `name`:指定持久化类的全限定名,如果不指定,Hibernate会认为这是一...

    java框架之hibernate

    - 使用128位UUID算法生成字符串类型的标识符。 - 具有全局唯一性。 #### 四、联合主键 在Hibernate中,可以使用复合主键来表示具有多个字段作为主键的实体。以下是一种定义复合主键的方法: ```xml ...

    Hibernate内置标识符生成器

    7. UUID(Universally Unique Identifier)生成器:Hibernate 提供了两种 UUID 生成器,`uuid.hex` 和 `uuid.string`。这两种生成器使用 128 位的 UUID 算法,生成全局唯一的标识符。`uuid.hex` 生成的是 32 位的...

    hibernate3.1.2英文文档(pdf)

    - **UUID 算法**:生成全局唯一标识符。 - **Identity 列和序列**:利用数据库自身的机制生成主键。 以上是对 Hibernate 3.1.2 英文文档的部分内容解析,涉及了架构、配置和基本映射的关键概念。深入理解这些知识...

    hibernate详解

    例如,id元素用于指定主键,generator子元素定义主键生成策略,如Hi/Lo算法、UUID算法等。此外,还可以映射one-to-one、many-to-one、one-to-many、many-to-many等关系。 5. **Hibernate的类型**:Hibernate支持...

    hibernate主键生成策略

    【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...

    hibernate.hbm.xml详解

    - `uuid.hex`和`uuid.string`: 生成128位UUID的16进制或非编码版本。 - `foreign`: 使用关联对象的ID作为主键。 - 可自定义主键生成策略,扩展Hibernate类。 2. **普通属性(property)配置**: - `property`...

    hibernate的主键生成策略

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的...

    hibernate

    - UUID 算法:使用 UUID 作为主键。 通过上述内容可以看出,Hibernate 是一款非常强大的 ORM (Object Relational Mapping) 工具,它能够简化 Java 应用与数据库交互的过程。无论是简单的 CRUD 操作还是复杂的事务...

    hibernate-reference-3.1.1.pdf

    其中,关于主键生成策略的讨论,如Hi/Lo算法、UUID算法和自动增长列的处理,为开发者提供了多种选择,以适应不同的场景需求。 综上所述,《hibernate-reference-3.1.1.pdf》不仅是一份技术手册,更是Hibernate...

Global site tag (gtag.js) - Google Analytics