为什么数据库主键不要自增,而要用UUID这个类

网上的大多数解释是这样的:

UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的形式。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。


这还是没有说明为什么我们要用这个方法,说的是主键唯一的;

数据库我们设置自增的时候它的主键也是唯一的;

这边我要说的是用这个方法,防止注入式攻击,当我们使用主键自增的时候,

需要删除一个东西的时候,一般都是id=?。这样的话我就可以在url中修改这个id的值,

这样可能就被人删除了其他东西,UUID这个就是给主键id加上一层锁,使它不暴露给用户;


这是一条简单的插入语句

public void insert(User user){
user.setId(UUID.randomUUID().toString());
this.userDao.insert(user);
}



这边是JDK对于UUID类的解释:


A class that represents an immutable universally unique identifier (UUID).
  A UUID represents a 128-bit value.
 
 

There exist different variants of these global identifiers.  The methods
  of this class are for manipulating the Leach-Salz variant, although the
  constructors allow the creation of any variant of UUID (described below).
 
 

The layout of a variant 2 (Leach-Salz) UUID is as follows:
 
  The most significant long consists of the following unsigned fields:
 


  0xFFFFFFFF00000000 time_low
  0x00000000FFFF0000 time_mid
  0x000000000000F000 version
  0x0000000000000FFF time_hi
 

  The least significant long consists of the following unsigned fields:
 

  0xC000000000000000 variant
  0x3FFF000000000000 clock_seq
  0x0000FFFFFFFFFFFF node
 

 
 

The variant field contains a value which identifies the layout of the
  {@code UUID}.  The bit layout described above is valid only for a {@code
  UUID} with a variant value of 2, which indicates the Leach-Salz variant.
 
 

The version field holds a value that describes the type of this {@code
  UUID}.  There are four different basic types of UUIDs: time-based, DCE
  security, name-based, and randomly generated UUIDs.  These types have a
  version value of 1, 2, 3 and 4, respectively.
 
 

For more information including algorithms used to create {@code UUID}s,
  see RFC 4122: A
  Universally Unique IDentifier (UUID) URN Namespace
, section 4.2
  "Algorithms for Creating a Time-Based UUID".
 
  @since   1.5

public final class UUID implements java.io.Serializable, Comparable


表示一个不可变的普遍唯一标识符(UUID)的类。
UUID表示128位的值。

这些全局标识符有不同的变体。的方法
这个类是用来处理Leach-Salz变量的,尽管
构造函数允许创建任何UUID的变体(描述如下)。

版本2(Leach-Salz)UUID的布局如下:
最重要的长由以下无符号字段组成:
<前>
0 xffffffff00000000 time_low
0 x00000000ffff0000 time_mid
0 x000000000000f000版本
0 x0000000000000fff time_hi
< / pre >
最不重要的长由以下无符号字段组成:
<前>
0 xc000000000000000变体
0 x3fff000000000000 clock_seq
0 x0000ffffffffffff节点
< / pre >

的变体字段包含一个值,该值标识了该字段的布局
{ @code UUID }。上面描述的位布局仅适用于{@ code
UUID}的变量值为2,表示Leach-Salz变量。

版本字段包含一个值,它描述了这个{@ code的类型
UUID }。uuid有四种不同的基本类型:基于时间的DCE
安全性、基于名称和随机生成uuid。这些类型有
版本值分别为1、2、3和4。

用于更多信息,包括用于创建{@ code UUID}的算法,
看到< a href = " http://www.ietf.org/rfc/rfc4122.txt " > <我> RFC 4122:
通用唯一标识符(UUID)URN名称空间< /i>,第4.2节
创建基于时间的uuid的算法。
@since 1.5


你可能感兴趣的:(java)