首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建确定性指南

如何创建确定性指南
EN

Stack Overflow用户
提问于 2010-04-15 09:21:47
回答 5查看 45.3K关注 0票数 118

在我们的应用程序中,我们正在创建具有GUID值的属性的Xml文件。该值需要在文件升级之间保持一致。因此,即使文件中的其他所有内容都发生更改,该属性的GUID值也应该保持不变。

一个显而易见的解决方案是创建一个带有文件名和Guids的静态字典。然后,每当我们生成文件时,我们都会在字典中查找文件名并使用相应的guid。但这是不可行的,因为我们可能会扩展到100个文件,并且不想维护大量的guids。

因此,另一种方法是根据文件的路径使Guid相同。由于我们的文件路径和应用程序目录结构是唯一的,因此该路径的Guid应该是唯一的。因此,每次我们运行升级时,该文件都会根据其路径获得相同的guid。我找到了一个很酷的方法来生成这样的“Deterministic Guids”(感谢埃尔顿·斯通曼)。它基本上是这样做的:

代码语言:javascript
复制
private Guid GetDeterministicGuid(string input) 

{ 

//use MD5 hash to get a 16-byte hash of the string: 

MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); 

byte[] inputBytes = Encoding.Default.GetBytes(input); 

byte[] hashBytes = provider.ComputeHash(inputBytes); 

//generate a guid from the hash: 

Guid hashGuid = new Guid(hashBytes); 

return hashGuid; 

} 

因此,给定一个字符串,Guid始终是相同的。

有没有其他方法或推荐的方法来实现这一点?这种方法的利弊是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-14 09:15:30

正如@bacar所提到的,RFC 4122§4.3定义了一种创建基于名称的UUID的方法。这样做的优点(而不仅仅是使用MD5散列)是,这些UUID保证不会与非基于名称的UUID冲突,并且与其他基于名称的UUID冲突的可能性非常(非常)小。

在.NET框架中没有本机支持来创建它们,但是我发布了实现该算法的code on GitHub。它的使用方法如下:

代码语言:javascript
复制
Guid guid = GuidUtility.Create(GuidUtility.UrlNamespace, filePath);

为了进一步降低与其他GUID冲突的风险,您可以创建一个私有GUID作为名称空间ID (而不是使用RFC中定义的URL名称空间ID )。

票数 163
EN

Stack Overflow用户

发布于 2012-02-22 06:14:39

这会将任何字符串转换为Guid,而不必导入外部程序集。

代码语言:javascript
复制
public static Guid ToGuid(string src)
{
    byte[] stringbytes = Encoding.UTF8.GetBytes(src);
    byte[] hashedBytes = new System.Security.Cryptography
        .SHA1CryptoServiceProvider()
        .ComputeHash(stringbytes);
    Array.Resize(ref hashedBytes, 16);
    return new Guid(hashedBytes);
}

有更好的方法来生成唯一的Guid,但这是一种一致地将字符串数据键升级为Guid数据键的方法。

票数 30
EN

Stack Overflow用户

发布于 2010-06-11 22:09:19

正如Rob提到的,您的方法不会生成UUID,它会生成一个看起来像UUID的散列。

UUID上的RFC 4122特别允许确定性(基于名称的) UUIDs版本3和版本5分别使用md5和SHA1。大多数人可能对版本4很熟悉,它是随机的。Wikipedia给出了一个很好的版本概述。(请注意,这里使用的“版本”一词似乎描述了UUID的“类型”-版本5不会取代版本4)。

似乎有一些库可以生成版本3/5的UUID,包括python uuid moduleboost.uuid (C++)和OSSP UUID。(我还没找过任何.net的)

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2642141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档