所以我有一个必须与之交互的第三方应用程序,该应用程序需要我的用户表中的用户ID。 问题是我将我的 userID 存储为 GUID,而第 3 方应用程序仅接受整数。所以我想,如果有一种方法可以将 GUID 转换为整数,然后能够将其转换回来(当我从他们的服务器获得有关 userID 的通信时),那么我就不必重新编码太多。 有什么想法吗?
整数使用 32 位,而 GUID 为 128 位 - 因此,无法在不丢失信息的情况下将 GUID 转换为整数,因此无法将其转换回来。
编辑:您也许可以将 GUID 存储到 GUID 表中,在其中为每个 GUID 分配一个唯一的整数 ID。这样,您就可以在给定整数 ID 的情况下取回 GUID。
您需要存储从 Guid 到第 3 方整数的映射:现有用户表中的新“int ThirdPartyId”字段或新表。
您需要一个 128 位整数类型来保存 GUID 的等效项。您可以使用 Guid 的 ToByteArray() 方法来获取字节以及接受字节数组的构造函数来恢复 Guid。
您还可以使用 GetHashCode() 方法来获取整数,但两个不同的 GUID 可能具有相同的哈希码,因为可能的 Guid 数量多于 32 位整数。
Guid 比整数大得多,并且无法容纳整数。
添加整数 Identity 列,这基本上是第二个 ID 列,并将该 columnID 提供给应用程序。
创建一个包含两列的新表(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 和所有其他用户信息。
干杯。
多年后,对于任何想看到这一点的人来说,到 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());
}
}