`
zllzgg
  • 浏览: 32340 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

UUID做主键,优点,缺点!

    博客分类:
  • java
阅读更多
那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性.
优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
缺点:
比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。

那么到底使用不使用UUID做主键呢?? http://hi.baidu.com/thinkinginlamp/blog/item/c609d10979710e81d0581b60.html

那么如何生成UUID,一个自动生成不重复文本的函数,Hibernate提供的uuid.
hibernate中的uuid是自动生成主键的一种机制,但是它依赖于hiberbate包,刚刚将它从Hibernate中提取出来,(从其他博客和公司的组件代码中发现了UUID的生成类)供各位使用.

import java.net.InetAddress;

/**
 * 
 * @author zhangguang
 *
 */
public class UUIDHexGenerator {

	private static final int IP;
	private static UUIDHexGenerator instance = null;
	private static short counter = (short) 0;
	private static final int JVM = (int) ( System.currentTimeMillis() >>> 8 );
	private String sep = "";
	   static {
				    int ipadd;
				    try {
				     ipadd = toInt( InetAddress.getLocalHost().getAddress() );
				    }
				    catch (Exception e) {
				     ipadd = 0;
				    }
				    IP = ipadd;
		   }
		protected String format(int intval) {
		   String formatted = Integer.toHexString(intval);
		   StringBuffer buf = new StringBuffer("00000000");
		   buf.replace( 8-formatted.length(), 8, formatted );
		   return buf.toString();
		}

		protected String format(short shortval) {
		   String formatted = Integer.toHexString(shortval);
		   StringBuffer buf = new StringBuffer("0000");
		   buf.replace( 4-formatted.length(), 4, formatted );
		   return buf.toString();
		}

	   public static int toInt( byte[] bytes ) {
		     int result = 0;
		     for (int i=0; i<4; i++) {
		      result = ( result << 8 ) - Byte.MIN_VALUE + (int) bytes[i];
		     }
		     return result;
		   }
	   protected int getJVM() {
		    return JVM;
		   }


	   protected short getCount() {
	    synchronized(UUIDHexGenerator.class) {
	     if (counter<0) counter=0;
	     return counter++;
	    }
	   }
	/**
	 * @author zhangguang
	 * 
	 * @return UUID. 一組 UUID,係由一串 16 位元組(亦稱 16 字節,或 128 位元)的16進位數字所構成
	 */
	public String 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 int getIP() {
	    return IP;
	   }

	   protected short getHiTime() {
	    return (short) ( System.currentTimeMillis() >>> 32 );
	   }
	   protected int getLoTime() {
	    return (int) System.currentTimeMillis();
	}

		public static UUIDHexGenerator getInstance()
		{
			if (instance == null)
				instance = new UUIDHexGenerator();
			return instance;
		}

	   
	   
	   
	public static void main( String[] args ) throws Exception {

	    for ( int i=0; i<10; i++) {
	     String id = getInstance().generate();
	     System.out.println(id);
	     String id2 = getInstance().generate();
	     System.out.println(id2);
	    }

	}
	


	}
分享到:
评论
1 楼 Vity 2014-01-14  
java.util.UUID.randomUUID().toString()

有啥区别?除了---

相关推荐

    Laravel开发-has-uuid

    "Laravel开发-has-uuid" 指的是在Laravel项目中同时使用自动递增ID(Auto Increment)和UUID(Universally Unique Identifier)作为模型的主键。这种设计允许我们在保持数据库性能的同时,提供更灵活的主键策略。 ...

    Hibernate主键生成策略

    不同的主键生成策略具有不同的优缺点和适用场景。开发者应根据项目的具体需求和使用的数据库类型来选择最合适的策略。例如,在需要支持多种数据库时,可以选择 `native` 策略;在需要全局唯一性时,可以选择 `uuid....

    hibernate主键生成策略

    - **简介**:`hilo` 策略结合了 `increment` 和 `sequence` 的优点,在数据库中维护一个额外的表来管理主键。 - **应用场景**:适用于多实例或多线程环境下,避免主键冲突。 - **特点**: - 可以通过 `&lt;param&gt;` ...

    java生成UUID通用唯一识别码 中文WORD版

    - 数据库记录的主键:UUID可以作为数据库表记录的主键,保证每条记录的唯一性,尤其在分布式数据库系统中。 - 临时ID:在需要临时唯一标识的场景下,UUID是一个好选择,因为它不会与其他系统产生的ID冲突。 - ...

    sqlserver数据库主键的生成方式小结(sqlserver,mysql)

    这种方式的优点是数据库引擎自动处理并发情况,确保了ID的唯一性,无需开发者过多关注。但其缺点是无法直接获取刚生成的ID值,迁移数据时可能遇到困难。因此,这种方式常用于存储基础信息的表,如员工表。 **二、...

    uuid-tutorial

    - 数据库主键:UUID可以作为数据库记录的唯一标识,尤其在分布式系统中,避免了主键冲突。 - 文件名:在分布式文件系统中,UUID可以生成唯一的文件名。 - 临时ID:在需要短暂且唯一的标识时,如Web会话ID。 6. *...

    关于数据库设计中主键问题的思考

    本文主要探讨了几种常见的主键选取策略及其优缺点。 首先,自动增长式主键是最常见的方式之一。这种策略在SQL Server等数据库中广泛使用,其优点在于简化了插入新记录的操作,因为数据库系统会自动为新记录分配一个...

    分布式id方法

    ### 分布式ID生成方法详解 #### 一、需求背景及重要性 ...例如,在追求性能和扩展性的场景下,可以考虑采用基于时间戳的算法(如Snowflake算法)结合UUID的优点,以平衡唯一性、有序性和系统性能之间的关系。

    hibernate介绍

    - 描述:使用128位的通用唯一标识符(UUID)作为主键。 - 优点:保证全局唯一性。 - 缺点:占用空间较大。 8. **Foreign** - 描述:使用外键作为主键。 - 优点:适用于特定数据库,如SQL Server和MySQL。 - ...

    Choosing a Primary Key.doc

    在数据库设计中,选择合适的主键是至关重要的。主键是表中用于唯一标识记录的一列或多列数据,它是...理解各种键的优缺点,并结合数据库设计的最佳实践,可以帮助我们做出明智的决策,确保数据库的高效、稳定和可维护。

    最全MySQL面试题集合

    为什么不建议用 UUID 为主键 * 数字的比较比字符串要快很多 * 非自增 什么样的查询语句用不到索引 * 函数计算 * 数据类型转换 * like %开头 * or 运算 * 复合索引,没有左边字段索引 如何优化 * 经常被查询的...

    hibernate框架笔记

    - **uuid**:生成UUID作为主键。 - **assigned**:手动指定主键值。 - **复合主键**:使用多个字段组合成主键,适用于某些特殊场景。 #### 七、使用JPA注解配置实体类 JPA (Java Persistence API) 是一种Java EE...

    分布式三高架构设计实战

    另外,作为数据库主键,UUID的无序性可能影响性能。 2. 类Snowflake方案:这是一种根据时间戳、机器标识和自增序列号划分ID空间的算法。时间戳确保趋势递增,机器标识用于区分不同节点,自增序列号保证在同一毫秒内...

    Hibernate学习笔记整理

    Hibernate 的优点 * 是一个 ORM 框架 * 操作数据库的框架 * 面向对象编程的代码编程比较简单 * 做到了数据缓存 * 广泛应用于企业中的中小型项目 Hibernate 的缺点 * 该框架程序员是没有办法干预 SQL 语句的生成 *...

    Mysql面试题详解MySQL常见面试题汇总(建议收藏!!!)

    8. 索引的优缺点:索引的优点是可以加快数据的检索速度,缺点是会增加写入操作的时间和空间消耗。 9. 聚簇索引和非聚簇索引的区别:聚簇索引是指索引和数据存储在一起的索引,而非聚簇索引是指索引和数据存储分离的...

    mysql面试题目大全

    16. **主键使用自增ID或UUID**: - 自增ID紧凑且顺序,利于索引效率;UUID随机,防止主键冲突。 17. **存储过程的优缺点**: - 优点:封装复杂操作,提高代码复用,减少网络传输。 - 缺点:不易调试,不利于...

    数据库优化调优.docx

    然而,UUID的主要缺点在于存储占用空间较大,同时在某些情况下查询效率较低。 3. **雪花算法**:一种分布式ID生成算法,由Twitter提出并开源。该算法生成的ID是递增的64位整数,包含时间戳、机器ID、序列号等信息。...

    分布式ID生成

    这些标识通常作为数据库中的主键,用来保证数据的一致性和唯一性。同时,为了提高查询效率,这些标识还需要具备一定的特性——全局唯一性与趋势有序性。因此,设计一个高效且可靠的分布式ID生成机制显得尤为重要。 ...

    细聊分布式ID生成方法.pdf

    - **主键(Primary Key)**:用于唯一标识数据库表中的每一行记录的一个或多个字段的组合。 #### 三、分布式ID生成方法 针对不同的应用场景,本文介绍了几种常见的分布式ID生成方案。 ##### 3.1 消息ID(Message-...

Global site tag (gtag.js) - Google Analytics