c# – 如何创建确定性Guids

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

一个明显的解决方案是创建一个具有文件名和要用于它们的Guids的静态字典。然后每当我们生成文件,我们查找字典的文件名,并使用相应的guid。但这是不可行的,因为我们可能扩展到100的文件,并不想保持大的列表的guids。

所以另一种方法是使Guid基于文件的路径相同。由于我们的文件路径和应用程序目录结构是唯一的,Guid应该对于该路径是唯一的。因此,每次我们运行升级时,文件基于其路径获取相同的guid。我发现了一个很酷的方式来生成这样的“Deterministic Guids”(谢谢埃尔顿Stoneman)。它基本上这样做:

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将永远是相同的。

有没有其他方法或推荐的方法这样做?这种方法的优点或缺点是什么?

如@bacar所述,RFC 4122§4.3定义了一种创建基于名称的UUID的方法。执行此操作(仅使用MD5哈希)的优点是,这些保证不与非基于名称的UUID冲突,并且具有与其他基于名称的UUID冲突的非常(非常)小的可能性。

在.NET Framework中没有用于创建这些的本机支持,但我发布了实现该算法的code on GitHub。它可以如下使用:

Guid guid = GuidUtility.Create(GuidUtility.UrlNamespace, filePath);

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

http://stackoverflow.com/questions/2642141/how-to-create-deterministic-guids

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 如何创建确定性Guids