将 GUID 转换为整数并返回

问题描述 投票:0回答:7

所以我有一个必须与之交互的第三方应用程序,该应用程序需要我的用户表中的用户ID。 问题是我将我的 userID 存储为 GUID,而第 3 方应用程序仅接受整数。所以我想,如果有一种方法可以将 GUID 转换为整数,然后能够将其转换回来(当我从他们的服务器获得有关 userID 的通信时),那么我就不必重新编码太多。 有什么想法吗?

.net asp.net
7个回答
9
投票

整数使用 32 位,而 GUID 为 128 位 - 因此,无法在不丢失信息的情况下将 GUID 转换为整数,因此无法将其转换回来。

编辑:您也许可以将 GUID 存储到 GUID 表中,在其中为每个 GUID 分配一个唯一的整数 ID。这样,您就可以在给定整数 ID 的情况下取回 GUID。


8
投票

您需要存储从 Guid 到第 3 方整数的映射:现有用户表中的新“int ThirdPartyId”字段或新表。


6
投票

您需要一个 128 位整数类型来保存 GUID 的等效项。您可以使用 Guid 的 ToByteArray() 方法来获取字节以及接受字节数组的构造函数来恢复 Guid。

您还可以使用 GetHashCode() 方法来获取整数,但两个不同的 GUID 可能具有相同的哈希码,因为可能的 Guid 数量多于 32 位整数。


2
投票

Guid 比整数大得多,并且无法容纳整数。


0
投票

添加整数 Identity 列,这基本上是第二个 ID 列,并将该 columnID 提供给应用程序。


0
投票

创建一个包含两列的新表(MyUserMappings)

1) ThirdPartyUserID (INT, NOT NULL, IDENTITY(1,1))

2)我的用户ID(GUID,NOTNULL)

将您的用户 ID 中的所有 GUID 插入到此表中

插入 MyUserMappings(MyUserID) 从 MyUsers 中选择 MyGUIDUserID

您还需要在 MyUsers 表上放置一个触发器,以便每次 MyUsers 表获取新行时在 MyUsersMappings 表中插入新行。

现在创建一个视图,显示 MyUsers 表中的所有字段和 MyUsermappingsTable 中的第三方用户 ID 字段。

现在您不需要对现有应用程序进行任何 DAL 更改,并且您的原始表不受影响。因此,您现有的应用程序将保持原样。您的新代码可以查询视图而不是表来返回整数 ID 和所有其他用户信息。

干杯。


0
投票

多年后,对于任何想看到这一点的人来说,到 2024 年,这都是完全可能的!

如此处所示:http://csharp.tips/tip/article/965-How-to-convert-GUID-to-Integer

“.NET 4.0 引入了 BigInteger 结构,它是 128 位整数。”

对于那些不想点击链接的人,这里是代码:

using System;
using System.Numerics;


class Program
{
    static void Main(string[] args)
    {
        // ex: 8a847645-8cac-422c-962a-fdf3aa220065            
        Guid g = Guid.NewGuid();
 
        // Convert GUID to BigInteger
        // ex: 134252730720501571475137903438348973637
        BigInteger bigInt = new BigInteger(g.ToByteArray());                       
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.