将Guid表示为一组整数

时间:2009-08-30 10:14:53

标签: c# algorithm guid

如果我想将guid表示为一组整数,我将如何处理转换?我正在考虑获取guid的字节数组表示并将其分解为最少可能转换回原始guid的32位整数。代码示例首选...

此外,结果整数数组的长度是多少?

5 个答案:

答案 0 :(得分:5)

  System.Guid guid = System.Guid.NewGuid();
    byte[] guidArray = guid.ToByteArray();

    // condition
    System.Diagnostics.Debug.Assert(guidArray.Length % sizeof(int) == 0);

    int[] intArray = new int[guidArray.Length / sizeof(int)];

    System.Buffer.BlockCopy(guidArray, 0, intArray, 0, guidArray.Length);


    byte[] guidOutArray = new byte[guidArray.Length];

    System.Buffer.BlockCopy(intArray, 0, guidOutArray, 0, guidOutArray.Length);

    System.Guid guidOut = new System.Guid(guidOutArray);

    // check
    System.Diagnostics.Debug.Assert(guidOut == guid);

答案 1 :(得分:5)

由于GUID只有16个字节,您可以将其转换为四个整数:

Guid id = Guid.NewGuid();

byte[] bytes = id.ToByteArray();
int[] ints = new int[4];
for (int i = 0; i < 4; i++) {
   ints[i] = BitConverter.ToInt32(bytes, i * 4);
}

转换回来只是将整数作为字节数组并放在一起:

byte[] bytes = new byte[16];
for (int i = 0; i < 4; i++) {
   Array.Copy(BitConverter.GetBytes(ints[i]), 0, bytes, i * 4, 4);
}
Guid id = new Guid(bytes);

答案 2 :(得分:4)

不知何故,我以这种方式做得更有乐趣:

byte[] bytes = guid.ToByteArray();
int[] ints = new int[bytes.Length / sizeof(int)];
for (int i = 0; i < bytes.Length; i++) {
    ints[i / sizeof(int)] = ints[i / sizeof(int)] | (bytes[i] << 8 * ((sizeof(int) - 1) - (i % sizeof(int))));
}

并转换回来:

byte[] bytesAgain = new byte[ints.Length * sizeof(int)];
for (int i = 0; i < bytes.Length; i++) {
    bytesAgain[i] = (byte)((ints[i / sizeof(int)] & (byte.MaxValue << 8 * ((sizeof(int) - 1) - (i % sizeof(int))))) >> 8 * ((sizeof(int) - 1) - (i % sizeof(int))));
}
Guid guid2 = new Guid(bytesAgain);

答案 3 :(得分:2)

内置Guid结构是不够的?

构造

public Guid(
    byte[] b
)

并且

public byte[] ToByteArray()

其中,返回包含此实例值的16元素字节数组。

将字节打包成整数,反之亦然应该是微不足道的。

答案 4 :(得分:1)

Guid通常只是一个128位的数字。

- 编辑

所以在C#中,你可以通过

获得16个字节
byte[] b = Guid.NewGuid().ToByteArray();