如何将Long转换为Guid和Vice Versa?

kev*_*aub 6 language-agnostic guid long-integer

这甚至可能吗?我甚至都不认为,但是我看到了一些尝试这样做的代码.但是,我的单元测试表明它无法正常工作.我确实看到了一些类似的想法:

只是为了澄清.Guid创作超出了我的控制范围; 因此,我不能只将值存储在其中一个Guid集中.

Jen*_*ens 20

GUID永远不会长,因为,正如我所说,GUID的大小是16个字节,长的大小是8个字节.你快乐地丢弃GUID的8个字节,即使它们是零!:-)

Guid只是一个128位数据结构,long是64位数据结构......

这意味着只要高64位是零,我们就可以安全地丢弃它们,以后重建它们,因为在这种情况下,零不代表完整数据.所以是的,它是数据丢失,但在某些情况下,它是可以重建的数据丢失.(考虑压缩)

当你这样做时,这没有什么不同:

long x = 5000;
//Converting 64 bit data structure into a 32 bit, discarding the upper 32 bits.
int y = (int)x;
//Converting 32 bit data structure into a 64 bit.
long z = (long)y;
Run Code Online (Sandbox Code Playgroud)

这些显式转换不会内置到系统中,因为它不是必须以不同方式执行.

public static Guid ToGuid(long value)
{
    byte[] guidData = new byte[16];
    Array.Copy(BitConverter.GetBytes(value), guidData, 8);
    return new Guid(guidData);
}

public static long ToLong(Guid guid)
{
    if (BitConverter.ToInt64(guid.ToByteArray(), 8) != 0)
        throw new OverflowException("Value was either too large or too small for an Int64.");
    return BitConverter.ToInt64(guid.ToByteArray(), 0);
}
Run Code Online (Sandbox Code Playgroud)

显然,这绝不应该与GUID一起使用,但只要GUID只有64位的"实际数据"就可以安全使用,这是确保永远不会在guids上使用它的最佳方法,除非它们使用的是长.

作为预防措施,我已经添加了抛出OverflowException,以防Guid实际上在最后64位中存储除了0'之外的任何内容,因为生成的long将无法转换回相同的Guid.

所以......

只要创建的guid适合长期,有可能吗?只是当它超过长指定的大小时.正确?

是真的......显然GUID的相应长值不容易阅读,这里有一些例子(long = guid):

1.340 = 0000053c-0000-0000-0000-000000000000
98.605 = 0001812d-0000-0000-0000-000000000000
149.957 = 000249c5-0000-0000-0000-000000000000
218.125.225 = 0d0053a9-0000-0000-0000-000000000000
4.249.596.910 = fd4bb3ee-0000-0000-0000-000000000000
23.139.913.545 = 633f0f49-0005-0000-0000-000000000000
9.223.372.036.854.775.807 = ffffffff-ffff-7fff-0000-000000000000
-9.223.372.036.854.775.808 = 00000000-0000-8000-0000-000000000000
-1 = ffffffff-ffff-ffff-0000-000000000000
Run Code Online (Sandbox Code Playgroud)

是的转换那些方式和任何长期价值你可以想到...

但是因为你说:

Guid创作超出了我的控制范围.

你实际上做这件事的可能性极小,相反,你所拥有的Guid最有可能是用任何常用算法生成的,这会使Guid在这种情况下无法使用.


现在这样做有什么意义吗?......这需要洞察特定情况,并且是另一个讨论...


Ces*_*Gon 8

GUID长度为16个字节."长"通常被理解为64位(即8字节)长.您无法在不丢失或提供额外数据的情况下进行转换.