使用 c# .net 创建数据库列的简单哈希值

jaf*_*ffa 5 .net c# sql hashcode

我想存储 n 个列的简单哈希值,例如地址和名称,并将哈希值存储在另一列中。我想通过简单地比较哈希值来使用哈希值作为在两个源之间同步数据的快速方法。做这样的事情的最好方法是什么。我不需要加密功能来创建哈希。

例如

John Smith,1 Long Lane Road,村庄,城镇,邮政编码。哈希:AK67KS38

我希望哈希值足够简单以便于可读(没有整个范围的 Unicode 集)。

编辑 好的,我仍然想在 C# 代码和 LINQ 中执行此操作。数据是通过询问其他来源从外部引入的。没有其他方法可以将其与我的数据唯一链接,因为没有来自外部源的“密钥”可供链接。因此从这个意义上说,时间戳值不是一个选择。我知道这种方法并不“准确”,但我可以接受。我可能会添加手动检查可能的哈希匹配的功能,并在可接受的情况下将它们进一步提升到数据库中。

jim*_*lan 3

Jon - 另一种方法是将时间戳列添加到表(或对象中)。将其设置为 UTC 并完成。当然,您可能会争论编辑等方面的并发性,但是如果您仅比较哈希列值,那么确定最新的编辑/差异会更加困难。

但是,如果哈希列方法是“必须”的,那么您应该在不同文化的数据库安装中非常小心,因为机制可能会有所不同。在这种情况下,我会仔细考虑时间戳与哈希值的优点。

[编辑] Jon,根据您最近的编辑,我建议在您的对象上创建自定义 GetHashCode() 和 Equals() 并使用比较器为您完成繁重的工作。我快速谷歌了一下,想知道什么可能有用。一个合理的(2分钟谷歌)起点可能在这里:

http://www.eggheadcafe.com/community/aspnet/2/78458/hashcode.aspx

这是一个快速代码示例(基于您对用于哈希的名称和地址的要求[谢谢 resharper :-)]):

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

典型用法:

bool isChanged = ContactFromServer1.Equals(ContactFromServer2);
//etc..
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助