浅谈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 Springboot整合支付宝接口的教程详解

    Java Springboot整合支付宝接口的教程详解 介绍: Java Springboot是当前广泛使用的Java开发框架之一,兼容了Spring框架的优势并整合了大量解决方案,易用易扩展,本文将详细讲解如何在Java Springboot应用中整合支付宝接口。 准备工作: 1. 开通支付宝开放平台账号: 首先访问 支付宝开放平台官方网站,进行开发者注册…

    Java 2023年5月19日
    00
  • JAVA算法起步之快速排序实例

    JAVA算法起步之快速排序实例 什么是快速排序 快速排序是一种十分高效的排序算法,采用分治的策略,对于数据量大的随机数组,快速排序是目前已知的最快的排序算法之一。它的基本思路是:通过一趟排序将待排序列分成两部分,一部分比基准元素小,一部分比基准元素大,然后再递归地对这个两部分进行快速排序,以达到整个序列有序的目的。 快速排序的基本步骤 从数列中挑出一个元素,…

    Java 2023年6月1日
    00
  • Java中字符数组、String类、StringBuffer三者之间相互转换

    Java中字符数组、String类、StringBuffer三者之间可以互相转换,下面分别介绍其转换方法。 1、字符数组与String类之间的转换 1.1、字符数组转String char[] charArray = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’}; String str = new String(charArray); 1.2、Stri…

    Java 2023年5月27日
    00
  • 如何选择合适的Java垃圾回收器?

    选择合适的Java垃圾回收器对于应用的性能和稳定性至关重要。以下是如何选择合适的Java垃圾回收器的完整使用攻略: 1. 确定需求和限制 在选择垃圾回收器之前,需要先了解应用的需求和限制。例如,需要考虑的因素包括: 应用的类型和规模 应用的性能要求 应用的内存消耗 应用的响应时间等 2. 了解常见的 Java 垃圾回收器 Java 虚拟机提供了多种垃圾回收器…

    Java 2023年5月11日
    00
  • Java–SSH,SSM和Spring Boot框架区别及优缺点说明

    Java–SSH,SSM和Spring Boot框架区别及优缺点说明 Java作为一门比较成熟的编程语言,有很多框架供我们使用。其中,SSH、SSM和Spring Boot是比较流行的三种框架。本文将从以下几个方面分别介绍它们的区别以及优缺点。 SSH框架 介绍 SSH框架指的是基于Spring、Spring MVC和Hibernate三个框架进行整合的系…

    Java 2023年5月19日
    00
  • 如何突破PHP程序员的技术瓶颈分析

    如何突破PHP程序员的技术瓶颈分析 1. 确定技术瓶颈 首先,我们需要确定技术瓶颈是什么。通常来说,技术瓶颈可能来自以下几个方面: 编程能力 网络编程能力 数据库设计能力 项目经验 针对不同的问题,我们需要采取不同的解决方案。一般来说,我们可以通过下面的方式来做一些自我评估: 性能分析:使用工具,比如xhprof,Blackfire等,对PHP应用的性能进行…

    Java 2023年6月15日
    00
  • Spring AOP源码深入分析

    关于“Spring AOP源码深入分析”的完整攻略,以下是我总结的步骤: 第一步:环境准备 首先,我们需要配置好Maven、Java、IDEA等相关工具。 第二步:理解AOP的基本概念 在开始深入分析Spring AOP源码之前,我们需要了解一些AOP的基本概念,例如:切面(Aspect)、连接点(join point)、通知(Advice)、切点(poin…

    Java 2023年5月19日
    00
  • SpringBoot2学习之springboot与spring区别分析

    Spring Boot是基于Spring框架的快速开发框架,它可以帮助我们快速构建Spring应用程序。在学习Spring Boot时,我们需要了解Spring Boot与Spring框架之间的区别。本文将详细讲解Spring Boot与Spring框架之间的区别,并提供两个示例。 1. Spring Boot与Spring框架的区别 Spring Boot…

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