Java 字节数组的GUID
我写这段代码是为了将GUID转换成字节数组。有人能在上面打洞或提出更好的建议吗Java 字节数组的GUID,java,guid,bytearray,uuid,Java,Guid,Bytearray,Uuid,我写这段代码是为了将GUID转换成字节数组。有人能在上面打洞或提出更好的建议吗 public static byte[] getGuidAsByteArray(){ UUID uuid = UUID.randomUUID(); long longOne = uuid.getMostSignificantBits(); long longTwo = uuid.getLeastSignificantBits(); return new byte[] { (byte)(lon
public static byte[] getGuidAsByteArray(){
UUID uuid = UUID.randomUUID();
long longOne = uuid.getMostSignificantBits();
long longTwo = uuid.getLeastSignificantBits();
return new byte[] {
(byte)(longOne >>> 56),
(byte)(longOne >>> 48),
(byte)(longOne >>> 40),
(byte)(longOne >>> 32),
(byte)(longOne >>> 24),
(byte)(longOne >>> 16),
(byte)(longOne >>> 8),
(byte) longOne,
(byte)(longTwo >>> 56),
(byte)(longTwo >>> 48),
(byte)(longTwo >>> 40),
(byte)(longTwo >>> 32),
(byte)(longTwo >>> 24),
(byte)(longTwo >>> 16),
(byte)(longTwo >>> 8),
(byte) longTwo
};
}
在C++中,我记得能够做到这一点,但我想在java中没有办法用内存管理和所有的:
UUID uuid = UUID.randomUUID();
long[] longArray = new long[2];
longArray[0] = uuid.getMostSignificantBits();
longArray[1] = uuid.getLeastSignificantBits();
byte[] byteArray = (byte[])longArray;
return byteArray;
编辑
如果您想要生成一个完全随机的UUID,作为不符合任何正式类型的字节,这将比UUID.randomUUID()生成的类型4 UUID更有效和浪费:
我将依赖于内置功能:
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
或者类似的
ByteArrayOutputStream ba = new ByteArrayOutputStream(16);
DataOutputStream da = new DataOutputStream(ba);
da.writeLong(uuid.getMostSignificantBits());
da.writeLong(uuid.getLeastSignificantBits());
return ba.toByteArray();
(注意,未经测试的代码!)您可以从apache commons进行检查。您可能不想使用它,但请检查以查看其getRawBytes()
方法是如何实现的:
public UUID(long mostSignificant, long leastSignificant) {
rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}
您可以看看ApacheCommonsLang3。相反,请看,将它转换成uuID.< /p> Dupe?-不,我提到C++中,你可以跳过,把所有的东西复制到另一个数组中,但是它看起来不像你在java中那样做。当我调用uuID.NAMEUUIDFRONBASEL(BB.ARRAY())时,它的副本不可能给出相同的UUID。这是意料之中的,nameuidFromBytes从您传递给它的字节中获取一个散列。要反序列化上面的格式,请再次阅读long并使用构造函数UUID(long,long),抱歉对旧帖子进行评论。但是为什么不使用这个:uuid.toString().getBytes(),以及如何将字节[]转换为mostSignificate和leastSignificate,以便重新生成原始的uuid?
uuid.toString().getBytes()
构建一个字节[],其中包含系统默认字符串编码的字节表示形式以及uuid的文本表示形式。因此,可能是表示字符串的UTF-8字节,如37B4C0FB-6BEB-4EEF-8D4F-5552C3C76952
。这是36字节长。另一方面,建议的解决方案只有两个长
s,或128位,或16字节。所以,44%的空间。
public UUID(long mostSignificant, long leastSignificant) {
rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}
public static byte[] newUUID() {
UUID uuid = UUID.randomUUID();
long hi = uuid.getMostSignificantBits();
long lo = uuid.getLeastSignificantBits();
return ByteBuffer.allocate(16).putLong(hi).putLong(lo).array();
}