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

yizhihongxing

以下是详细讲解“浅谈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日

相关文章

  • Java8 接口默认方法和静态方法

    当我们在定义接口时,可能会希望在接口中提供一些默认实现,这样我们在实现该接口时可以选择性地重写它们,也可以直接继承实现。Java 8 引入了接口默认方法和静态方法来实现这个目的。 接口默认方法 接口默认方法是 Java 8 新增的特性,可以直接在接口中实现方法。这些方法会被自动继承到实现该接口的所有类上。 语法格式: public interface 接口名…

    Java 2023年5月26日
    00
  • JAVA LinkedList和ArrayList的使用及性能分析

    JAVA LinkedList和ArrayList的使用及性能分析 1.介绍 在JAVA中,LinkedList和ArrayList都是常见的集合类。两种集合类都可以实现List接口,用于存储一组有序的数据。但是,它们在内部实现、性能以及使用场景上存在很大的差异。 LinkedList使用链表来实现,每一个节点都存储了当前元素的值和下一个节点的地址。由于链表…

    Java 2023年5月26日
    00
  • Java实现简单图形界面计算器

    来一份详细的“Java实现简单图形界面计算器”的攻略吧。 一、概述 本攻略将带领读者用Java实现一个简单的图形界面计算器。主要用到的技术是Swing,一个Java提供的GUI工具包。通过这个攻略,读者将了解到如何使用Swing快速完成一个图形界面程序的开发。 二、实现步骤 创建项目 首先,我们需要创建一个Java项目。可以使用Eclipse/IDEA等开发…

    Java 2023年5月19日
    00
  • 如何利用反射批量修改java类某一属性的代码详解

    针对如何利用反射批量修改Java类某一属性的问题,下面是一个完整的攻略: 1. 反射基础 Java反射是指在运行时动态地获取对象的元信息,包括类、方法、字段等,并对其进行操作。使用反射可以实现很多动态性较高的功能,例如动态创建对象、动态获取类的信息、动态调用方法等。 具体实现Java反射需要使用到以下几个核心类: Class:代表一个类类型,可以获取类的名称…

    Java 2023年6月15日
    00
  • asp的程序能实现伪静态化的方法

    ASP是一种动态网页开发技术,通常需要通过服务器端动态生成HTML代码。对于某些站点,如果开启了伪静态,可以有效地提升网站的SEO表现,提高流量。本文将详细讲解ASP程序如何实现伪静态化,包含以下内容: 了解伪静态化的原理 伪静态化是指将动态生成的页面URL转化为静态的HTML文档。例如将”index.asp?id=1″转化为”index_1.html”。当…

    Java 2023年6月15日
    00
  • Spring Web MVC和Hibernate的集成配置详解

    下面我将详细讲解“Spring Web MVC和Hibernate的集成配置详解”的完整攻略,具体过程如下: 第一步:创建Spring Web MVC和Hibernate项目 首先,我们需要在IDE中创建一个Spring Web MVC项目,然后再添加Hibernate框架的支持。这里以使用IntelliJ IDEA为例,具体步骤如下: 打开IntelliJ…

    Java 2023年6月15日
    00
  • Spring Security用户定义

    Spring Security是一个在Spring项目中提供安全认证和授权的框架,其中涉及的用户定义指的是自定义用户认证机制和用户授权访问权限控制。下面我们将详细讲解如何进行Spring Security用户定义,并提供两条完整的示例。 1. 用户认证 1.1 定义用户认证机制 用户认证机制指的是如何验证用户身份。Spring Security提供了多种认证…

    Java 2023年5月20日
    00
  • springmvc fastjson 反序列化时间格式化方法(推荐)

    SpringMVC Fastjson 反序列化时间格式化方法 1. 什么是Fastjson? Fastjson是一个Java语言编写的高性能JSON处理器,它可以将Java对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为Java对象。Fastjson具有快速、简单、灵活等特点,是目前Java开发中最流行的JSON处理器之一。 2. Spri…

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