Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RandomStringUtils.RandomAlphameric(30)是有效的GUID策略吗?_Java_Guid_Uuid_Distributed Computing_Primary Key Design - Fatal编程技术网

Java RandomStringUtils.RandomAlphameric(30)是有效的GUID策略吗?

Java RandomStringUtils.RandomAlphameric(30)是有效的GUID策略吗?,java,guid,uuid,distributed-computing,primary-key-design,Java,Guid,Uuid,Distributed Computing,Primary Key Design,我需要一个随机字符串生成器,它生成一个字母数字字符串,作为唯一的键,用于30个字符或更少的分布式系统。它不能包含任何特殊字符 这样行吗 底层实现使用java.util.Random 唯一密钥集可能少于1000亿,系统需要每秒处理多达1000条记录 如何证明此策略具有足够低的冲突概率,可以用作主键生成器?为什么不想使用java.util.UUID类?它返回32位字符串的随机UUID。 实施示例: import java.util.UUID; public class GenerateUUID {

我需要一个随机字符串生成器,它生成一个字母数字字符串,作为唯一的键,用于30个字符或更少的分布式系统。它不能包含任何特殊字符

这样行吗

底层实现使用
java.util.Random

唯一密钥集可能少于1000亿,系统需要每秒处理多达1000条记录


如何证明此策略具有足够低的冲突概率,可以用作主键生成器?

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

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));
   }
} 

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


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

Random不是唯一的。使用随机数生成来获得“唯一”值会遇到生日问题。这将把1/2^48的概率转化为1/2^24的概率,最终命中的速度比你想象的要快。使用uuid;它们被设计成具有普遍独特性

32个字符:

UUID.randomUUID().toString.replace("-","")
UUID uuid = UUID.randomUUID();
String uuidStr = Base64.encodeBase64URLSafeString(ByteBuffer.wrap(new byte[16])
    .putLong(uuid.getMostSignificantBits())
    .putLong(uuid.getLeastSignificantBits())
            .array()).replace("=", "");
22个字符:

UUID.randomUUID().toString.replace("-","")
UUID uuid = UUID.randomUUID();
String uuidStr = Base64.encodeBase64URLSafeString(ByteBuffer.wrap(new byte[16])
    .putLong(uuid.getMostSignificantBits())
    .putLong(uuid.getLeastSignificantBits())
            .array()).replace("=", "");

UUID()
包含超过30个字符,并且
Base64(UUID().bytes)
包含非字母数字字符。感谢您的回答!你能解释一下你的数量数字吗<代码>其周期??使用java.util.Random调用2^48的
~1%
,调用2^48次后,您将获得相同的数字。在你的例子中,你需要1000亿个30字符的字符串,这意味着3万亿个随机元素,3万亿大约是2^48的1%,这意味着你可以在序列重复之前生成100倍于1000亿个30字符的字符串。好的,这更有意义。你确定算法不会重复一个字符序列直到所有的组合都用完吗?这是LCG的理论,尽管java.util.Random没有明确说明这一事实。使用低ID和高ID生成标识符怎么样?()