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

标签 language-agnostic guid long-integer

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

  • 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/

    相关文章:

    matrix - 行优先和列优先顺序真的是编程语言的属性吗

    .net - 知名 GUID 列表

    在非负立方体中找到轴对齐超立方体并集的顶点的算法,所有顶点都在原点

    math - float 学坏了吗?

    language-agnostic - 您多久担心需要处理多少个 if 案例?

    python - 我们如何获取长整数的用户输入?

    c - 两个 -Wformat 警告(未知的转换类型和格式参数太多)

    c# - 如何在 selenium 中获取表行 ID

    guid - 如何在 Livecode(或 HyperTalk)中创建 UUID (GUID)?

    java - 为什么这段 Java 代码不打印 Long 值?