【发布时间】:2019-05-31 16:40:21
【问题描述】:
我正在尝试创建一个哈希码方法。我有如下代码:
private static object GetValue<T>(object item, string propertyName)
{
ParameterExpression arg = Expression.Parameter(item.GetType(), "x");
Expression expr = Expression.Property(arg, propertyName);
UnaryExpression unaryExpression = Expression.Convert(expr, typeof(object));
var propertyResolver = Expression.Lambda<Func<T, object>>(unaryExpression, arg).Compile();
return propertyResolver((T)item);
}
private static int GetHashCode<T>(T obj, List<string> columns)
{
unchecked
{
int hashCode = 17;
for (var i = 0; i < columns.Count; i++)
{
object value = GetValue<T>(obj, columns[i]);
var tempHashCode = value == null ? 0 : value.GetHashCode();
hashCode = (hashCode * 23) + tempHashCode;
}
return hashCode;
}
}
private static void TestHashCode()
{
var t1 = new { ID = (long)2044716, Type = "AE", Method = (short)1022, Index = 3 };
var t2 = new { ID = (long)12114825, Type = "MEDAPE", Method = (short)1700, Index = 2 };
var e1 = t1.GetHashCode();
var e2 = t2.GetHashCode();
var columns = new[] { "ID", "Type", "Method", "Index" }.ToList();
var k1 = GetHashCode(t1, columns);
var k2 = GetHashCode(t2, columns);
}
e1值为-410666035,e2值为101205027。 k1 值为 491329214。k2 值为 491329214。
哈希码步骤:
hashCode = 17
tempHashCode = 2044716
哈希码 = 2045107
tempHashCode = 1591023428
哈希码 = 1638060889
tempHashCode = 66978814
哈希码 = -912326403
tempHashCode = 3
哈希码 = 491329214
k1 和 k2 怎么可能是同一个值?因为默认的 .net gethashcode 方法给出了两个不同的值。我想创建一个可以获取列列表的哈希码方法。我想通过特定属性创建一个哈希码。我正在尝试通过特定属性为对象获取唯一值。
如果 GetHashCode 不保证唯一值,我如何通过特定属性识别对象?
【问题讨论】:
-
在调试代码时,对于每个输入,请在每个 for 循环迭代结束时共享
hashCode的值。 -
在
for方法的for循环中,GetValue<T>()调用返回什么类型和值?请编辑您的问题以包含类型 (GetType()) 和每次循环迭代的value变量的ToString()结果。 -
@Progman 类型和值很清楚。它们是在对象中定义的。
-
您需要使用具有 Compare() 方法的 IEquatable,以便在哈希给出重复项时获取唯一值。请参阅:docs.microsoft.com/en-us/dotnet/api/…
标签: c# hashcode gethashcode