JAVA生成八位不重复的随机数最快的方法(省时间省空间)

您所在的位置:网站首页 java随机输入一个数怎么表示个十百 JAVA生成八位不重复的随机数最快的方法(省时间省空间)

JAVA生成八位不重复的随机数最快的方法(省时间省空间)

2024-07-10 12:04:17| 来源: 网络整理| 查看: 265

原代码 private String getCode(){ // 生成一个随机的8位编码 String code = StringUtils.getRandom(8); // 获取缓存中的编码集合 Set codeSets = redisCache.getCacheSet(Constants.ACT_CODE_KEY); // 如果生成的编码在缓存集合中已经存在,则递归调用getCode方法重新生成编码 if(codeSets.contains(code)){ return getCode(); } // 如果生成的编码在缓存集合中不存在,则直接返回该编码 return code; } 缺点:

1.递归调用可能导致性能问题:在生成编码的过程中,如果随机生成的编码已经存在于缓存集合中,那么会通过递归调用getCode()方法重新生成编码,直到找到一个不存在于缓存集合中的编码为止。这种递归调用可能会导致性能问题,特别是当缓存集合中的编码数量较大时,递归的次数可能非常多,影响系统的响应时间和资源消耗。

2.缺乏生成编码冲突的处理机制:虽然通过递归调用确保了生成的编码不会与缓存集合中已有的编码重复,但并没有处理编码冲突的其他情况。如果编码冲突的概率较高,那么递归调用新代码的次数可能会很多,影响系统性能。

新代码: import java.util.UUID; private String getCode(){ String code = UUID.randomUUID().toString().substring(0, 8); return code; }

UUID是根据时间戳和计算机MAC地址等数据生成的全局唯一标识符,非常适合作为唯一编码使用。

使用UUID.randomUUID()来获取一个UUID对象,然后调用toString()方法将其转换为String类型。接着,我们通过substring(0, 8)方法截取UUID字符串的前8位作为编码。

UUID内容: package com.muyuan.common.utils.uuid; //记得更改包名 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import com.muyuan.common.exception.UtilException; /** * 提供通用唯一识别码(universally unique identifier)(UUID)实现 * * */ public final class UUID implements java.io.Serializable, Comparable { private static final long serialVersionUID = -1185015143654744140L; /** * SecureRandom 的单例 * */ private static class Holder { static final SecureRandom numberGenerator = getSecureRandom(); } /** 此UUID的最高64有效位 */ private final long mostSigBits; /** 此UUID的最低64有效位 */ private final long leastSigBits; /** * 私有构造 * * @param data 数据 */ private UUID(byte[] data) { long msb = 0; long lsb = 0; assert data.length == 16 : "data must be 16 bytes in length"; for (int i = 0; i < 8; i++) { msb = (msb 62))) & (leastSigBits >> 63)); } /** * 与此 UUID 相关联的时间戳值。 * *

* 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。 * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 * *

* 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。 * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 * * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 */ public long timestamp() throws UnsupportedOperationException { checkTimeBase(); return (mostSigBits & 0x0FFFL) > 16) & 0x0FFFFL) >> 32; } /** * 与此 UUID 相关联的时钟序列值。 * *

* 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 *

* {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 * UnsupportedOperationException。 * * @return 此 {@code UUID} 的时钟序列 * * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 */ public int clockSequence() throws UnsupportedOperationException { checkTimeBase(); return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); } /** * 与此 UUID 相关的节点值。 * *

* 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 *

* 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 * * @return 此 {@code UUID} 的节点值 * * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 */ public long node() throws UnsupportedOperationException { checkTimeBase(); return leastSigBits & 0x0000FFFFFFFFFFFFL; } /** * 返回此{@code UUID} 的字符串表现形式。 * *

* UUID 的字符串表示形式由此 BNF 描述: * * * {@code * UUID = ---- * time_low = 4* * time_mid = 2* * time_high_and_version = 2* * variant_and_sequence = 2* * node = 6* * hexOctet = * hexDigit = [0-9a-fA-F] * } * * * * * @return 此{@code UUID} 的字符串表现形式 * @see #toString(boolean) */ @Override public String toString() { return toString(false); } /** * 返回此{@code UUID} 的字符串表现形式。 * *

* UUID 的字符串表示形式由此 BNF 描述: * * * {@code * UUID = ---- * time_low = 4* * time_mid = 2* * time_high_and_version = 2* * variant_and_sequence = 2* * node = 6* * hexOctet = * hexDigit = [0-9a-fA-F] * } * * * * * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 * @return 此{@code UUID} 的字符串表现形式 */ public String toString(boolean isSimple) { final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); // time_low builder.append(digits(mostSigBits >> 32, 8)); if (false == isSimple) { builder.append('-'); } // time_mid builder.append(digits(mostSigBits >> 16, 4)); if (false == isSimple) { builder.append('-'); } // time_high_and_version builder.append(digits(mostSigBits, 4)); if (false == isSimple) { builder.append('-'); } // variant_and_sequence builder.append(digits(leastSigBits >> 48, 4)); if (false == isSimple) { builder.append('-'); } // node builder.append(digits(leastSigBits, 12)); return builder.toString(); } /** * 返回此 UUID 的哈希码。 * * @return UUID 的哈希码值。 */ @Override public int hashCode() { long hilo = mostSigBits ^ leastSigBits; return ((int) (hilo >> 32)) ^ (int) hilo; } /** * 将此对象与指定对象比较。 *

* 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 * * @param obj 要与之比较的对象 * * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} */ @Override public boolean equals(Object obj) { if ((null == obj) || (obj.getClass() != UUID.class)) { return false; } UUID id = (UUID) obj; return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); } // Comparison Operations /** * 将此 UUID 与指定的 UUID 比较。 * *

* 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 * * @param val 与此 UUID 比较的 UUID * * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 * */ @Override public int compareTo(UUID val) { // The ordering is intentionally set up so that the UUIDs // can simply be numerically compared as two numbers return (this.mostSigBits < val.mostSigBits ? -1 : // (this.mostSigBits > val.mostSigBits ? 1 : // (this.leastSigBits < val.leastSigBits ? -1 : // (this.leastSigBits > val.leastSigBits ? 1 : // 0)))); } // ------------------------------------------------------------------------------------------------------------------- // Private method start /** * 返回指定数字对应的hex值 * * @param val 值 * @param digits 位 * @return 值 */ private static String digits(long val, int digits) { long hi = 1L



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭