Cep*_*pod 58
这是不可能的,因为UUID是每个定义的16字节数.但是,当然,您可以生成8个字符长的唯一字符串(请参阅其他答案).
还要小心生成更长的UUID并对它们进行子串,因为ID的某些部分可能包含固定的字节(例如MAC,DCE和MD5 UUID的情况).
Ant*_*rin 35
你可以尝试RandomStringUtils 从apache.commons上课:
import org.apache.commons.lang3.RandomStringUtils;
final int SHORT_ID_LENGTH = 8;
// all possible unicode characters
String shortId = RandomStringUtils.random(SHORT_ID_LENGTH);
Run Code Online (Sandbox Code Playgroud)
请记住,它将包含所有可能的字符,既不是URL也不是人类友好的.
所以也查看其他方法:
// HEX: 0-9, a-f. For example: 6587fddb, c0f182c1
shortId = RandomStringUtils.random(8, "0123456789abcdef");
// a-z, A-Z. For example: eRkgbzeF, MFcWSksx
shortId = RandomStringUtils.randomAlphabetic(8);
// 0-9. For example: 76091014, 03771122
shortId = RandomStringUtils.randomNumeric(8);
// a-z, A-Z, 0-9. For example: WRMcpIk7, s57JwCVA
shortId = RandomStringUtils.randomAlphanumeric(8);
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,id较小id的碰撞概率可能很大.查看生日问题如何适用于您的案例.你可以在这个答案中找到很好的解释如何计算近似值.
Ral*_*lph 15
第一:即使java UUID.randomUUID或.net GUID生成的唯一ID也不是100%唯一的.特别地,UUID.randomUUID"仅"是128位(安全)随机值.因此,如果将其减少到64位,32位,16位(甚至1位),那么它就变得不那么独特了.
所以这至少是一个基于风险的决定,你的uuid必须有多长.
第二:我认为当你谈到"只有8个字符"时,你的意思是一串8个普通的可打印字符.
如果您想要一个长度为8个可打印字符的唯一字符串,则可以使用base64编码.这意味着每个字符6位,所以总共得到48位(可能不是很独特 - 但也许你的应用程序可以)
所以方法很简单:创建一个6字节的随机数组
SecureRandom rand;
// ...
byte[] randomBytes = new byte[16];
rand.nextBytes(randomBytes);
Run Code Online (Sandbox Code Playgroud)
然后将其转换为Base64字符串,例如 org.apache.commons.codec.binary.Base64
BTW:如果有更好的方法可以随机创建"uuid",这取决于你的应用程序.(如果你每秒只创建一次UUID,那么添加一个时间戳是个好主意)(顺便说一下:如果你把两个随机值组合起来(xor),结果总是至少和最大的一样随机随机的两个).
正如@Cephalopod所说,这是不可能的,但是您可以将UUID缩短为22个字符
public static String encodeUUIDBase64(UUID uuid) {
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return StringUtils.trimTrailingCharacter(BaseEncoding.base64Url().encode(bb.array()), '=');
}
Run Code Online (Sandbox Code Playgroud)
这是我在这里使用的类似方法,基于 Anton Purin 答案生成唯一的错误代码,但依赖于更合适的方法org.apache.commons.text.RandomStringGenerator而不是(曾经,不再)已弃用的org.apache.commons.lang3.RandomStringUtils:
@Singleton
@Component
public class ErrorCodeGenerator implements Supplier<String> {
private RandomStringGenerator errorCodeGenerator;
public ErrorCodeGenerator() {
errorCodeGenerator = new RandomStringGenerator.Builder()
.withinRange('0', 'z')
.filteredBy(t -> t >= '0' && t <= '9', t -> t >= 'A' && t <= 'Z', t -> t >= 'a' && t <= 'z')
.build();
}
@Override
public String get() {
return errorCodeGenerator.generate(8);
}
}
Run Code Online (Sandbox Code Playgroud)
所有有关碰撞的建议仍然适用,请注意。
| 归档时间: |
|
| 查看次数: |
146706 次 |
| 最近记录: |