我想存储n个列的简单哈希值,例如地址和名称,并将哈希存储在另一列中。我想通过简单地比较哈希值,使用哈希值作为在两个源之间同步数据的快速方法。 做这样的事情的最佳方式是什么。我不需要加密功能来创建哈希。
e.g。
约翰史密斯,长巷道1号,村镇,邮政编码。 哈希:AK67KS38
我希望哈希值足够简单易读(不需要设置整个Uni代码范围)。
修改 好吧我还是想在c#代码和LINQ中这样做。通过询问其他来源将数据引入外部。没有其他方法可以将此唯一链接与我的数据相关联,因为从外部源链接到没有“密钥”。所以从这个意义上说,时间戳值不是一个选项。我知道这种方法并不“精确”,但我可以忍受。我可以添加手动审查可能的哈希匹配的功能,并在可接受的情况下将它们进一步提升到数据库中。
答案 0 :(得分:2)
Jon - 另一种方法是在表(或对象)中添加时间戳列。将其设置为UTC并完成它。当然,您可以在编辑等方面争论并发性,但如果您只是比较哈希列值,那么确定最新的编辑/差异就会困难得多。
但是,如果哈希列方法是'必须',那么您应该在不同文化的数据库安装中非常小心,因为机制可能会有所不同。在这种情况下,我会仔细考虑时间戳与散列的优点。
<强> [编辑] 强> Jon,根据您最近的编辑,我建议您在对象上创建一个自定义的GetHashCode()和Equals(),然后使用comparer为您执行grunt工作。我做了一个快速的谷歌来计算可能有用的东西。一个合理的(2分钟谷歌)起点可能在这里:
http://www.eggheadcafe.com/community/aspnet/2/78458/hashcode.aspx
这是一个快速的代码示例(根据您对哈希[谢谢你重新评估: - ]]使用的名称和地址的要求:)
public class ContactDetails
{
public string Name { get; set; }
public string Address { get; set; }
public string Village { get; set; }
public string Town { get; set; }
public string PostCode { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (ContactDetails)) return false;
return Equals((ContactDetails) obj);
}
public bool Equals(ContactDetails other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Name, Name) && Equals(other.Address, Address);
}
public override int GetHashCode()
{
unchecked
{
return ((Name != null ? Name.GetHashCode() : 0)*397)
^ (Address != null ? Address.GetHashCode() : 0);
}
}
}
典型用法:
bool isChanged = ContactFromServer1.Equals(ContactFromServer2);
//etc..
希望这会有所帮助
答案 1 :(得分:0)
假设您的列被复制到用户实例(用户):
DataContractSerializer serializer = new DataContractSerializer(typeof(User));
MemoryStream memoryStream = new MemoryStream();
XmlWriter writer = XmlDictionaryWriter.CreateBinaryWriter(memoryStream);
serializer.WriteObject(memoryStream, user);
byte[] serializedData = memoryStream.ToArray();
// Calculte the serialized data's hash value
SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
byte[] hash = SHA.ComputeHash(serializedData);
// Convert the hash to a base 64 string
string hashAsText = Convert.ToBase64String(hash);
请注意,我已将哈希转换为基本64字符串,并且您也可以使用MD5,因为哈希是为校验和目的而计算的