【问题标题】:Create a consistant GUID or unique identifier from a string从字符串创建一致的 GUID 或唯一标识符
【发布时间】:2016-10-18 18:13:28
【问题描述】:

假设我有一个字符串,例如“70c3bdc5ceeac673”。是否可以在 C# 中基于此字符串创建类似 GUID 的结构(DB 列仅接受唯一标识符)?目标是每次我传入该值时都会创建相同的 Guid 或唯一字符串。我想基本上就像带有密钥的 Hmac SHA1 哈希。

【问题讨论】:

  • @Jack 这个答案是关于在 sql server 中创建一个存储 guid,我对此没有任何问题,但我需要能够根据 70c3bdc5ceeac673 字符串创建相同的确切 guid。基本上是一种加密形式。
  • Guid 类有一个接受字符串的构造函数。您只需要想出一些方案来扩大太短的输入:您的示例只有 64 位,而 GUID 需要 128 位。也许我误解了这个问题?
  • 基本上我希望相同的字符串始终转换为相同的 Guid

标签: c#


【解决方案1】:

从 SHA256 哈希创建 Guid 似乎是一个简单的选择:

var guid = new Guid(
   System.Security.Cryptography.SHA256.Create()
      .ComputeHash(Encoding.UTF8.GetBytes("70c3bdc5ceeac673")).Take(16).ToArray());

代码丢弃了一半的哈希结果,但它不会改变相同的字符串总是转换为相同的 Guid 的事实。

或者,根据您的要求,只需将字符串转换为字节数组并用 0 填充/删除额外的可能就足够了。

【讨论】:

  • 这可能是我需要的。只要该字符串始终转换为我所需要的相同 guid,初始字符串将是一个设备 UUID。我会测试一下。
  • 也许 MD5 更适合这里,因为它已经创建了 128 但结果因此无需剪切...
【解决方案2】:

如果您知道所有字符串都在 16 个非宽字符内(如 70c3bdc5ceeac673),则可以使用:

// value is your string

var bytes = new byte[16];
Encoding.UTF8.GetBytes(value, 0, value.Length, bytes, 0);
var guid = new Guid(bytes);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多