gpt4 book ai didi

language-agnostic - 如何将 Long 转换为 Guid,反之亦然?

转载 作者:行者123 更新时间:2023-12-04 13:02:33 27 4
gpt4 key购买 nike

这甚至可能吗?我什至不认为它是,但我看到一些试图做到这一点的代码。但是,我的单元测试表明它不起作用。我确实看到了一些类似的想法:

  • Converting GUID to Integer and Back
  • Converting System.Decimal to System.Guid

  • 只是为了澄清。 Guid 创建不在我的控制范围内;因此,我不能只将值存储在 Guid 集之一中。

    最佳答案

    A GUID can never fit a long, because, as I say, a GUID's size is 16 bytes, and a long's size is 8 bytes. You cannoy happily discard 8 bytes off a GUID, even if they are zeroes! :-)



    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;

    这些显式转换并未内置于系统中,因为并非如此,因此必须以不同的方式进行。
    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);
    }

    显然,这不应该在一般情况下与 GUID 一起使用,但只要 GUID 只有 64 位“实际数据”,就可以安全使用,确保永远不要在 guid 上使用它的最佳方法,除非它们是使用创建的长。

    作为预防措施,在 Guid 实际上在最后 64 位中存储除 0 之外的任何内容的情况下,我添加了抛出 OverflowException,因为结果 long 将无法转换回相同的 Guid。

    所以像这样...

    As long as the guid created fits in the the long, it is possible? It's just when it goes over the long's specified size. Correct?



    是真的……很明显GUID对应的long值不容易读懂,这里举几个例子(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

    是的,这些转换是双向的,并且对于您可以考虑的任何长期值(value)...

    但是因为你声明:

    The Guid creation is outside of my control.



    您实际上不太可能这样做,相反,您拥有的 Guid 很可能是使用任何常见算法生成的,这将使 Guid 在这种情况下无法使用。

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

    关于language-agnostic - 如何将 Long 转换为 Guid,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3900703/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com