首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RandomStringUtils.randomAlphanumeric(30)是一个有效的GUID策略吗?

RandomStringUtils.randomAlphanumeric(30)是一个有效的GUID策略吗?
EN

Stack Overflow用户
提问于 2016-01-09 06:04:52
回答 3查看 3.8K关注 0票数 2

我需要一个随机字符串生成器,它生成一个α-数字字符串,作为分布式系统中的唯一密钥,即30字符或更少的。它不能包含任何特殊字符。

RandomStringUtils#randomAlphanumeric会在这方面发挥作用吗?

底层实现使用java.util.Random

这组唯一的键可能不到1000亿,系统需要每秒处理1000条记录。

如何证明该策略具有足够低的碰撞概率,可以作为主密钥生成器工作?

EN

回答 3

Stack Overflow用户

发布于 2016-01-09 06:58:18

java.util.Random实现了一个LCG算法,其周期为2^48个数字,因此RandomStringUtils将与此实现一样好,而1000亿个30字符字符串将需要2^48个随机元素的1%左右。

请注意,java.util.Random不是密码安全的,因此给定一些GUID,可以推断下一个GUID,因此我将使用另一个使用加密安全随机数生成器(例如java.util.SecureRandom)的实现。

票数 4
EN

Stack Overflow用户

发布于 2016-01-09 06:15:04

为什么不想使用java.util.UUID类?它返回32位字符串的随机UUID。实例实现:

代码语言:javascript
复制
import java.util.UUID;

public class GenerateUUID {

   public static final void main(String... aArgs){
     //generate random UUIDs
     UUID idOne = UUID.randomUUID();
     UUID idTwo = UUID.randomUUID();
     log("UUID One: " + idOne);
     log("UUID Two: " + idTwo);
   }

   private static void log(Object aObject){
     System.out.println(String.valueOf(aObject));
   }
} 
票数 1
EN

Stack Overflow用户

发布于 2019-01-11 17:11:22

随机并不是唯一的。使用随机数生成来获得“唯一”值会遇到生日问题攻打。这将把1/ 2^48的概率转化为1/ 2^24的概率,这样你的命中率就会比你想象的要快。使用UUID;它们被设计成普遍独特的。

32个字符:

代码语言:javascript
复制
UUID.randomUUID().toString.replace("-","")

22个字符:

代码语言:javascript
复制
UUID uuid = UUID.randomUUID();
String uuidStr = Base64.encodeBase64URLSafeString(ByteBuffer.wrap(new byte[16])
    .putLong(uuid.getMostSignificantBits())
    .putLong(uuid.getLeastSignificantBits())
            .array()).replace("=", "");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34690288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档