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

时间:2011-02-17 10:57:52

标签: c# .net sql hashcode

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

e.g。

约翰史密斯,长巷道1号,村镇,邮政编码。 哈希:AK67KS38

我希望哈希值足够简单易读(不需要设置整个Uni代码范围)。

修改 好吧我还是想在c#代码和LINQ中这样做。通过询问其他来源将数据引入外部。没有其他方法可以将此唯一链接与我的数据相关联,因为从外部源链接到没有“密钥”。所以从这个意义上说,时间戳值不是一个选项。我知道这种方法并不“精确”,但我可以忍受。我可以添加手动审查可能的哈希匹配的功能,并在可接受的情况下将它们进一步提升到数据库中。

2 个答案:

答案 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,因为哈希是为校验和目的而计算的