【发布时间】:2021-07-04 20:15:34
【问题描述】:
我需要一种方法,在给定对象或对象的属性子集的情况下,跨 .NET 框架/环境/执行以最小的冲突一致地生成唯一 ID。
- 反复使用相同的属性应该总是产生相同的结果
- 冲突应该是最小的
- 属性是字符串、整数和小数的混合体
- 属性值不是敏感数据
- 不会添加或删除属性
- 使用它的应用程序只是内部的(不向公众开放)
- 我不想依赖 GetHashCode,它可能因 .NET 框架/环境/执行而异,如 great article at andrewlock.net 中所述
- 他建议使用possible method,但没有提供太多关于实际使用的信息
例如,给定一个固定对象
public class ExampleObject
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public int Prop3 { get; set; }
public decimal Prop4 { get; set; }
}
我正在考虑将所有值转换为字符串,将它们连接起来,然后使用一些确定性算法来获得所需的结果
// Convert all values to strings and concat
string str1 = "a";
string str2 = "b";
int int1 = 1;
decimal dec1 = 1.2m;
string concatStr = $"{str1}_{str2}_{int1.ToString()}_{dec1.ToString()}";
// Use the string to generate the desired value
我从字符串中看到了人们generate a MD5 hash,但我不确定字符串/整数/小数的数百万种可能组合在现实世界中的用法。
字符串的小数点也让我担心。该值不应该改变,但.ToString() 可以在不同的环境中以不同的方式处理精度吗?
【问题讨论】:
-
这不是 GUID/UUID。进行加密哈希,然后将结果截断为您需要的位数。 SHA-1 可能已经足够好了(现在应该避免数字签名,但这不是你正在做的)。这就是 GIT 使用的。字符串化任何你想要的,使用编码(比如,UTF-8)将结果字符串转换为字节数组,然后使用 System.Security.Cryptography 中的 SHA-1
-
@madreflection 好点!甚至没有想到这一点。你的意思是提交 sha1 哈希?快速搜索,看起来很相似,它们只是将字符串连接在一起并生成它:gist.github.com/masak/2415865
-
您可能希望在字符串化描述中包含类名(甚至可能是属性名)。您甚至可以进行 JSON 序列化来获取属性名称和值
-
@Flydog57 感谢您的建议。是否包含属性名称 + 值或只是将整个对象序列化为 JSON 以包含对象的定义,以防它发生变化?