UUID是一个通用唯一标识符(Universally Unique Identifier),用来识别信息中的某个元素,具有唯一性和无序性。Java中的UUID是由一组32个十六进制数字组成,共36位长度,其中包括4个“-”符号。
一、UUID生成方式
Java中提供了两种UUID生成方式:基于时间戳的UUID和随机UUID。
1、基于时间戳的UUID
import java.util.UUID; public class UUIDTest { public static void main(String[] args) { UUID uuid = UUID.randomUUID(); System.out.println(uuid); } }
通过调用UUID类中的randomUUID()
方法可以生成一个基于时间戳的UUID。
2、随机UUID
import java.util.UUID; public class UUIDTest { public static void main(String[] args) { UUID uuid = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d"); System.out.println(uuid); } }
通过调用UUID类中的fromString(String name)
方法可以生成一个随机UUID。
二、UUID的唯一性
UUID可以保证在全球范围内的唯一性,因为其生成方式与时间、MAC地址等因素有关,几乎可以排除重复的可能性。但是在极少数情况下,还是存在重复UUID的可能性,这种情况下建议使用其他方法来确保唯一性。
三、UUID在数据库中的应用
在数据库中,UUID可以作为主键标识一个数据行,由于其唯一性,可以避免数据重复问题,同时可以方便的做到分布式架构中数据的统一唯一标识。
CREATE TABLE `user` ( `id` varchar(36) NOT NULL, `name` varchar(50) NOT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) );
使用UUID作为主键的样例代码:
import java.sql.DriverManager; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.UUID; public class UUIDTest { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "root"; try { Connection conn = DriverManager.getConnection(url, user, password); String sql = "INSERT INTO user (id, name, age) VALUES (?, ?, ?)"; PreparedStatement ps = conn.prepareStatement(sql); UUID uuid = UUID.randomUUID(); ps.setString(1, uuid.toString()); ps.setString(2, "张三"); ps.setInt(3, 20); ps.executeUpdate(); System.out.println("插入成功!"); ps.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
使用UUID作为主键插入数据时,需要先通过UUID.randomUUID()
方法生成一个UUID,再将其转为字符串类型存入数据库中。
四、UUID的应用场景
UUID主要应用于以下场景:
- 作为数据库主键。
- 用于分布式应用系统中的唯一标识。
- 在WEB应用中,存储在Cookie中,确保多个站点之间的用户认证。
- 在Java类库中,用于确保对象的唯一标识。
五、UUID的优缺点
1、优点
- UUID全球唯一,可以避免关键数据重复的情况。
- UUID可以作为分布式系统的唯一标识,消除了ID冲突的问题。
- UUID用途广泛,适用于很多场景。
2、缺点
- UUID使用字符串存储,占用的存储空间较大,如果作为主键,会对性能造成一定的影响。
- 查询速度慢,需要对UUID进行索引优化。