Java RandomStringUtils.RandomAlphameric(30)是有效的GUID策略吗?
我需要一个随机字符串生成器,它生成一个字母数字字符串,作为唯一的键,用于30个字符或更少的分布式系统。它不能包含任何特殊字符 这样行吗 底层实现使用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 {
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生成标识符怎么样?()