如何为字符串生成GUID?

Meh*_*har 45 c#

我在为字符串生成GUID时遇到问题 - 例如:

Guid g = New Guid("Mehar");
Run Code Online (Sandbox Code Playgroud)

如何计算GUID "Mehar"?我得到一个例外.

Nac*_*mpi 98

相当古老的这个线程,但这就是我们解决这个问题的方法:

由于来自.NET框架的Guid是任意16字节或128位,您可以通过将任何散列函数应用于生成16字节散列的字符串并随后将结果传递给Guid构造函数来从任意字符串计算Guid.

我们决定使用MD5哈希函数,示例代码可能如下所示:

string input = "asdfasdf";
using (MD5 md5 = MD5.Create())
{
    byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(input));
    Guid result = new Guid(hash);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个Guid一代本身有一些缺陷,因为它取决于哈希函数的质量!如果您的哈希函数为您使用的大量字符串生成相等的哈希值,则会影响您的软件行为.

以下是产生128位摘要的最流行的哈希函数列表:

  • RIPEMD(碰撞概率:2 ^ 18)
  • MD4(碰撞概率:肯定)
  • MD5(碰撞概率:2 ^ 20.96)

请注意,也可以使用其他散列函数来生成更大的摘要,并简单地截断它们.因此,使用更新的散列函数可能是明智的.列出一些:

  • SHA-1
  • SHA-2
  • SHA-3

今天(2013年8月)160bit SHA1哈希可以被认为是一个不错的选择.

  • 如果你要用MD5哈希数据创建一个GUID,你真的应该遵循标准,*表示*这是[**Type 3**guid](http://en.wikipedia.org/ wiki/UNIVERSally_unique_identifier#Version_3_.28MD5_hash.29) - 表示数据来自MD5哈希.类型3 GUID的形式为"xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx",其中**"3"**表示"类型3",y被屏蔽为"10xx".您还可以使用SHA1哈希(类型5),将3更改为5. (18认同)
  • Nachbars,似乎GUID是微软的UUID实现,这意味着UUID规范适用 - http://stackoverflow.com/questions/246930/is-there-any-difference-between-a-guid-and -a-UUID (6认同)
  • 我们在这里谈论的是 GUID 而不是 UUID。注意区别。 (2认同)
  • 除了向第 3 方消费者提供有关使用哪种哈希算法创建“Guid”的信息之外,为什么符合某些位(例如 Type 3 Guid)很重要?该信息在比较中起什么作用? (2认同)

Noo*_*ilk 18

我很确定你System.Guid想要一个给定字符串的哈希(比方说,SHA-256).

请注意,在选择加密安全散列算法时,MD5,SHA0和SHA1通常都被认为是死的.SHA2及以上版本仍可使用.

  • 这应该是一个评论。关于作者的猜测和注释。不回答问题。 (2认同)

Pet*_*ete 6

您正在寻找的可能是生成版本3或版本5 UUID,它们是基于名称的UUID.(建议使用版本5).我认为.NET框架并不支持它.请参见http://en.wikipedia.org/wiki/Universally_Unique_Identifier

我做了一些谷歌搜索,看看我是否能在Win32 API中找到一些东西,但没有任何结果.但是,我确信.NET框架在某处隐藏了一些实现,因为据我所知,在.NET中生成COM对象时,如果没有提供显式GUID,那么.NET框架会生成一个名称基于UUID创建一个定义良好的ClassID和InterfaceID,即每次重新编译时都不会改变的UUID(如VB6).但这可能是隐藏的,所以我猜你需要自己实现算法.幸运的是,.NET提供了MD5和SHA1算法,所以我认为实现版本3和版本5 UUID应该太难了.


Rob*_*Day 5

我认为您对 Guid 的实际含义存在误解。没有诸如“Mehar”之类的字符串的 Guid 表示形式。

存在重载的原因new Guid(String s)是,您可以从典型的字符串表示形式创建 guid,例如“00000000-0000-0000-0000-000000000000”。

有关 Guid 实际含义的更多信息,请参阅 wiki 文章。

http://en.wikipedia.org/wiki/Globally_Unique_Identifier


Kob*_*obi 4

您不能以这种方式使用 GUID。Guid 的构造函数需要Guid 的有效字符串表示形式。

您正在寻找的称为哈希函数。(例如:MD5