仅生成8个字符的UUID

M.J*_*.J. 66 java uuid

UUID库生成32个字符的UUID.

我想生成仅8个字符的UUID,是否可能?

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的碰撞概率可能很大.查看生日问题如何适用于您的案例.你可以在这个答案中找到很好的解释如何计算近似值.

  • 由于不推荐使用`org.apache.commons.lang3.RandomStringUtils`,因此最好在https://commons.apache.org/proper/commons-text/中使用`org.apache.commons.text.RandomStringGenerator`. (4认同)
  • 仅供未来观众参考,随机性并不能保证唯一性。随机生成器保证随机性;并且可以产生一组具有重复值的有效随机数。 (4认同)

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),结果总是至少和最大的一样随机随机的两个).

  • 我知道这是一个旧答案,但要点是 - java 的 UUID 和 .net 的 GUID 是 100% 唯一的。你和宇宙的其他部分永远不会发生 uuid 碰撞。即使您遇到超过 100 万亿个 UUID,发生冲突的可能性仍然低于十亿分之一。https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions (3认同)

bst*_*k12 6

正如@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)


Bru*_*JCM 5

这是我在这里使用的类似方法,基于 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)

所有有关碰撞的建议仍然适用,请注意。