生成具有可变长度随机id作为输入的固定长度随机id

时间:2014-03-05 07:45:27

标签: java random uuid uniqueidentifier

我正在创建一个方法,它将UUID(作为String)作为输入并生成40字节(固定)输出(通过向其中添加更多信息)。 UUID字符串的长度本身为36个字符长(32个字符+4个连字符)。

我需要让它适合大约16个字符的东西。由于我们将这个uuid作为输入,这是我们的标识符,我们不想丢失它(我们可能需要用这个16个字符长的表示重新生成uuid)。

第二件事是,我们不确定我们总是会收到UUID作为输入,将来这可能是50个字符长的随机序列,所以需要为此生成固定的16个字符长的随机序列(也是可逆的)。

有可能为可变长度随机输入生成固定长度字节吗?需要确定唯一性,并且我们希望可变长度随机输入返回固定长度字节。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您必须保留数据库表以将小键映射到大键。这样你以后可以查找。这是对您的要求的100%支持

另一种方式是,

假设36个字符的UUID仅包含0123456789ABCDEF字符+ 4个非随机位置的

即。 abcdef14-15293abd-92835a5e-2524fa32

我们可以使用4bits简单地表示每个字符。 0 - > 0000,1 - > 0001,A - > 1010,B - > 1011等...

如果我们将两个4位数字合在一起作为一个8位字符,我们将得到16个字符。

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

public class Buffer{
    public static void main(String args[]) throws Exception{
        String input = "abcdef14-15293abd-92835a5e-2524fa32";
        String[] hexNums = input.split("-");
        ByteBuffer buffer = ByteBuffer.allocate(16);

        for(int i =0 ; i < 4; i++){
            long num = Long.parseLong(hexNums[i], 16);
            buffer.putInt((int)(num + Integer.MIN_VALUE));
        }
        byte[] bytes = buffer.array();
        String v = new String(bytes,"UTF-8");
        System.out.println(v);
    }
}