gpt4 book ai didi

c# - 如何创建确定性指南

转载 作者:IT王子 更新时间:2023-10-29 03:36:44 26 4
gpt4 key购买 nike

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

一个明显的解决方案是创建一个静态字典,其中包含文件名和要用于它们的 Guid。然后每当我们生成文件时,我们都会查找文件名的字典并使用相应的 guid。但这是不可行的,因为我们可能会扩展到 100 个文件并且不想维护大的 guid 列表。

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

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 发生冲突的风险,您可以创建一个私有(private) GUID 用作命名空间 ID(而不是使用 RFC 中定义的 URL 命名空间 ID)。

关于c# - 如何创建确定性指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com