将UUID转换为GUID,反之亦然

时间:2018-02-07 09:16:05

标签: java hibernate uuid guid endianness

在查询MSSQL数据库时,我有一个在hqlQuery结果中更改的UUID:

6e117f91-4734-2445-a959-ece721413f93

但返回具有修改后的UUID 917f116e-3447-4524-a959-ece721413f93 // correct UUID goes into query 6e117f91-4734-2445-a959-ece721413f93 // modified UUID from the resultset

的对象
createQuery("... where UUID = '6e117f91-4734-2445-a959-ece721413f93'").list() 

现在,当我使用修改后的UUID进行查询时:

    public class LongTypeAdapter extends TypeAdapter<Long>{
    @Override
    public Long read(JsonReader reader) throws IOException {
        if(reader.peek() == JsonToken.NULL){
            reader.nextNull();
            return null;
        }
        String stringValue = reader.nextString();
        try{
            Long value = Long.valueOf(stringValue);
            return value;
        }catch(NumberFormatException e){
            return null;
        }
    }
    @Override
    public void write(JsonWriter writer, Long value) throws IOException {
        if (value == null) {
            writer.nullValue();
            return;
        }
        writer.value(value);
    }
}

我找不到对象。

所以我需要将修改后的版本转换回原版(以及其他方式)。我不知道这是一个小的vs大端问题。

1 个答案:

答案 0 :(得分:0)

我没有断言这是最好的解决方案,但这是 a 解决方案。这应该将大端编码为小端,反之亦然。

import java.util.UUID;

// ...

 public static UUID uuidMarshalIntoMSFormat(UUID uuid)
  {
    if (uuid == null)
    {
      throw new IllegalArgumentException("Parameter, uuid cannot be null");
    }

    final long msbBigEndian = uuid.getMostSignificantBits();
    final long msbLittleEndian =
      ((msbBigEndian & 0x0000_00FF_0000_0000L) << 24) |
        ((msbBigEndian & 0x0000_FF00_0000_0000L) << 8) |
        ((msbBigEndian & 0x00FF_0000_0000_0000L) >>> 8) |
        ((msbBigEndian & 0xFF00_0000_0000_0000L) >>> 24) |
        ((msbBigEndian & 0x0000_0000_FF00_0000L) >>> 8) |
        ((msbBigEndian & 0x0000_0000_00FF_0000L) << 8) |
        ((msbBigEndian & 0x0000_0000_0000_FF00L) >>> 8) |
        ((msbBigEndian & 0x0000_0000_0000_00FFL) << 8);
    return new UUID(msbLittleEndian, uuid.getLeastSignificantBits());
  }