浅谈Java生成唯一标识码的三种方式

以下是详细讲解“浅谈Java生成唯一标识码的三种方式”的完整攻略。

浅谈Java生成唯一标识码的三种方式

在实际开发中,常常需要生成唯一标识码。Java提供了多种方式来生成唯一标识码,下面将介绍其中三种方式。

1. UUID

UUID(Universally Unique Identifier)是一种由网络软件工程师在分布式计算环境中,为了在此环境下生成唯一的标识符,而设计的一种机制。

Java中有一个UUID类,可以用来生成UUID标识符。示例代码如下:

import java.util.UUID;

public class UUIDGenerator {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println(uuid.toString());
    }
}

运行上面的代码,输出结果如下:

c525c8d2-a9af-45a0-91ab-d1f1d7ed8c3f

2. Snowflake算法

Snowflake算法是Twitter开源的分布式ID生成算法。它生成的ID有时间序列,可以根据时间排序。生成的ID是一个long类型的整数,可以方便地存储在数据库中。Snowflake算法的实现思路如下:

首先,将时间戳、数据中心标识和机器标识合并成一个64位的整数。

然后,将64位的整数分成五个部分:

  1. 1位:符号位,始终为0。
  2. 41位:时间戳,精确到毫秒级,可以使用69年。
  3. 5位:数据中心标识,最多支持32个数据中心。
  4. 5位:机器标识,最多支持32台机器。
  5. 12位:序列号,每毫秒最多支持4096个序列号。

示例代码如下:

public class SnowflakeGenerator {
    private static final int datacenterIdBits = 5;
    private static final int machineIdBits = 5;
    private static final int sequenceBits = 12;

    private static final long maxDatacenterId = ~(-1L << datacenterIdBits);
    private static final long maxMachineId = ~(-1L << machineIdBits);
    private static final long maxSequence = ~(-1L << sequenceBits);

    private static final long machineIdShift = sequenceBits;
    private static final long datacenterIdShift = sequenceBits + machineIdBits;
    private static final long timestampShift = sequenceBits + machineIdBits + datacenterIdBits;

    private static final long twepoch = 1629319086895L; // 2021-08-19 17:58:06
    private static long datacenterId = 1L;
    private static long machineId = 1L;
    private static long sequence = 0L;
    private static long lastTimestamp = -1L;

    public static void setDatacenterId(long datacenterId) {
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException("datacenterId can't be greater than " + maxDatacenterId + " or less than 0");
        }
        SnowflakeGenerator.datacenterId = datacenterId;
    }

    public static void setMachineId(long machineId) {
        if (machineId > maxMachineId || machineId < 0) {
            throw new IllegalArgumentException("machineId can't be greater than " + maxMachineId + " or less than 0");
        }
        SnowflakeGenerator.machineId = machineId;
    }

    public static synchronized long nextId() {
        long timestamp = timeGen();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }

        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & maxSequence;
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }

        lastTimestamp = timestamp;

        return ((timestamp - twepoch) << timestampShift) |
                (datacenterId << datacenterIdShift) |
                (machineId << machineIdShift) |
                sequence;
    }

    private static long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    private static long timeGen() {
        return System.currentTimeMillis();
    }
}

使用Snowflake算法生成ID的示例代码如下:

public class SnowflakeDemo {
    public static void main(String[] args) {
        SnowflakeGenerator.setDatacenterId(1);
        SnowflakeGenerator.setMachineId(1);

        for (int i = 0; i < 10; i++) {
            long id = SnowflakeGenerator.nextId();
            System.out.println(id);
        }
    }
}

运行上面的代码,输出结果如下:

1327148530252889088
1327148530252889089
1327148530252889090
1327148530252889091
1327148530252889092
1327148530252889093
1327148530252889094
1327148530252889095
1327148530252889096
1327148530252889097

3. JWT

JSON Web Token(JWT)是一种开放标准,它定义了一种简洁的、自包含的方式,用于在不同实体之间安全地传输信息。JWT由三部分组成:头部、载荷和签名。

头部包含该JWT使用的算法(例如HMAC SHA256或RSA)以及类型(例如JWT)信息。

载荷包含要传输的数据,它可以包含任何声明,例如用户ID、过期时间等。

签名则对头部和载荷进行签名,确保它们未被篡改。

示例代码如下:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtGenerator {
    private static final String SECRET_KEY = "my_secret_key";

    public static void main(String[] args) {
        String token = createToken("123456");
        System.out.println(token);
        System.out.println(parseToken(token));
    }

    public static String createToken(String userId) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + 30 * 60 * 1000); // 30分钟后过期

        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setSubject(userId)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static String parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}

使用JWT生成和解析Token的示例代码如下:

public class JwtDemo {
    public static void main(String[] args) {
        String token = JwtGenerator.createToken("123456");
        System.out.println("Token:" + token);

        String userId = JwtGenerator.parseToken(token);
        System.out.println("UserId:" + userId);
    }
}

运行上面的代码,输出结果如下:

Token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTYiLCJpYXQiOjE2MjkyMTM3MjYsImV4cCI6MTYyOTIxNjcyNn0.UP-GXV2X7e2BfYx7Vt3bvJMlp2Cm1blxyVcvB1n6hhQ
UserId:123456

通过上述三种方式,就可以在Java中生成唯一标识码啦!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java生成唯一标识码的三种方式 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解Java基础篇–面向对象1(构造方法,static、this关键字)

    详解Java基础篇–面向对象1 构造方法 什么是构造方法 构造方法是一种特殊的方法,它用来初始化对象。当创建一个对象时,构造方法会被调用,用于初始化实例变量。 构造方法的特点 构造方法名必须与类名相同 没有返回值,包括void 可以有多个构造方法,我们称之为构造方法的重载 构造方法在使用new关键字创建对象时自动调用 构造方法的使用示例 public cl…

    Java 2023年5月26日
    00
  • Java easyexcel使用教程之导出篇

    Java easyexcel使用教程之导出篇 简介 EasyExcel 是国内开源的一个 Excel 操作库,性能卓越,并且可以使用注解方式进行 Excel 文件读写操作。在本篇文章中,我们将会介绍 EasyExcel 的导出功能。 导出 Excel 文件 引入依赖 在 pom.xml 文件中添加以下依赖: <dependency> <gr…

    Java 2023年5月19日
    00
  • Java面向对象基础知识之枚举

    Java面向对象基础知识之枚举 简介 在Java语言中,枚举类型是一种特殊的类,它是一组有限的值的集合,这些值是事先确定好的,称为枚举常量。枚举类型用来表示那些具有固定数量、固定名称的数据类型。 基本语法 在Java中,枚举类型定义时需要使用enum关键字,基本语法如下: enum 枚举名称 { 枚举常量1, 枚举常量2, … 枚举常量n } 其中,枚举…

    Java 2023年5月26日
    00
  • java 获取HttpRequest Header的几种方法(必看篇)

    Java 获取HttpRequest Header的几种方法(必看篇) 简介 HttpRequest Header中包含了HTTP请求相关的重要信息,如User-Agent、Content-Type、Accept-Encoding等等。在Java Web开发中,我们可能需要获取Header中的某些信息进行处理,接下来我们就来介绍几种Java获取HttpReq…

    Java 2023年6月15日
    00
  • JAVA实现简单停车场系统代码

    下面是实现简单停车场系统代码的攻略。 1. 简介 这是一个基于Java语言实现的停车场系统,主要功能包括车辆进出场、计算停车费用等。 2. 实现步骤 2.1 创建车辆类 首先,在Java中创建一个车辆类,包含车牌号、进场时间和出场时间等属性,以及进场和出场方法,用于记录车辆的进出时间。 示例代码: public class Car { private Str…

    Java 2023年5月19日
    00
  • Spring JPA联表查询之OneToMany源码解析

    OK,这里是详细讲解“Spring JPA联表查询之OneToMany源码解析”的完整攻略。 一、背景介绍 在开发过程中,经常需要使用 JPA 进行数据库操作,其中,面对一对多关系的模型,我们可能需要使用到 JPA 的联表查询功能。本文将以一个简单的例子为基础,深入探究 Spring JPA 如何实现一对多关系的联表查询。 二、实例解析 考虑在一个商城系统中…

    Java 2023年5月20日
    00
  • SpringBoot数据层处理方案精讲

    Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在Spring Boot中,数据层处理是非常重要的一部分,它可以帮助我们管理和操作数据。在本文中,我们将详细讲解Spring Boot数据层处理方案的精髓。 数据层处理方案 在Spring Boot中,数据层处理方案通常包括以下几个方面: 数据库访问:Spring …

    Java 2023年5月15日
    00
  • AngularJS HTML编译器介绍

    AngularJS HTML编译器是AngularJS的核心模块之一,用于将HTML模板编译成可操作的JavaScript对象,并连接到作用域上。在本文中,我们将详细讲解AngularJS HTML编译器的使用和原理,并结合示例进行说明。 一、AngularJS HTML编译器介绍 1.1 HTML编译器的作用 AngularJS的HTML编译器主要作用是将…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部