【发布时间】:2009-03-06 18:36:38
【问题描述】:
所以我有一个我必须与之交互的第 3 方应用程序,这个应用程序需要我的用户表中的用户 ID。问题是我将我的用户 ID 存储为 GUID,而第 3 方应用程序只接受一个整数。所以我想,如果有办法将 GUID 转换为整数然后能够将其转换回来(因为我从他们的服务器获得有关用户 ID 的通信),那么我不必重新编码太多。有什么想法吗?
【问题讨论】:
所以我有一个我必须与之交互的第 3 方应用程序,这个应用程序需要我的用户表中的用户 ID。问题是我将我的用户 ID 存储为 GUID,而第 3 方应用程序只接受一个整数。所以我想,如果有办法将 GUID 转换为整数然后能够将其转换回来(因为我从他们的服务器获得有关用户 ID 的通信),那么我不必重新编码太多。有什么想法吗?
【问题讨论】:
整数使用 32 位,而 GUID 是 128 位 - 因此,无法在不丢失信息的情况下将 GUID 转换为整数,因此无法将其转换回来。
编辑:您也许可以将 GUID 存储到 GUIDs 表中,您可以在其中为每个表分配一个唯一的整数 ID。这样,您可以在给定整数 ID 的情况下取回 GUID。
【讨论】:
您需要存储一个从您的 Guid 到第 3 方整数的映射:现有用户表中的新“int thirdPartyId”字段或新表。
【讨论】:
您需要一个 128 位整数类型来保存 GUID 的等效项。您可以使用 Guid 的 ToByteArray() 方法获取字节和接受字节数组的构造函数来恢复 Guid。
您也可以使用 GetHashCode() 方法获取整数,但两个不同的 GUID 可能具有相同的哈希码,因为可能的 Guid 比 32 位整数更多。
【讨论】:
Guid 比整数大得多,不能放入整数。
【讨论】:
添加整数标识列,这基本上是第二个 ID 列,并将该列 ID 提供给应用程序。
【讨论】:
创建一个包含两列的新表 (MyUserMappings)
1) ThirdPartyUserID (INT, NOT NULL, IDENTITY(1,1))
2) MyUserID (GUID, NOTNULL)
通过执行将所有 GUID 从您的用户 ID 插入此表
插入到 MyUserMappings(MyUserID) 从我的用户中选择我的 GUIDUserID
您还需要在 MyUsers 表上放置一个触发器,以便在 MyUsers 表每次获得新行时在 MyUsersMappings 表中插入一个新行。
现在创建一个视图,显示 MyUsers 表中的所有字段和 MyUsermappingsTable 中的 ThirdParty UserID 字段。
现在您不需要对现有应用程序进行任何 DAL 更改,并且您的原始表不受影响。因此,您现有的应用程序将保持原样。而且您的新代码可以查询视图而不是表来返回整数 ID 和所有其他用户信息。
干杯。
【讨论】: