2014-01-28 24 views
0

我在写一个C#API,它存储了SWIFT消息类型。我需要编写一个类,它接收整个字符串消息并创建它的散列值,将此散列值存储在数据库中,以便在处理新消息时创建另一个散列值,并根据数据库中的散列值检查该散列值。散列字符串进行重复检测

我有以下

public static byte[] GetHash(string inputString) 
{ 
    HashAlgorithm algorithm = MD5.Create(); // SHA1.Create() 
    return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); 
} 

,我需要知道,这是否会做什么?

全球评论 *

所以,我收到的文件在一个安全的网络,所以我们对其有效性完全控制 - 我需要什么来控制正在取得重复支付。我可以将记录分解为各自的标签要素(SWFIT术语),然后单独检查它们,但这需要与数据库中的记录进行比较,并且成本不会发生。

我需要检查整个消息是否是已处理消息的副本,这就是为什么我使用这种方法。

+1

你必须记住,给定足够的数据样本,你将碰到md5。可能会更好的是在数据库中创建一个UNIQUE列。 –

+1

@Puciek我不认为数据库中的身份列会解决他的问题,因为他希望每个唯一邮件内容具有唯一的哈希,而不仅仅是每个邮件唯一的哈希。 –

+0

取决于您希望存储多少个字符串。查看[这个问题](http://stackoverflow.com/questions/201705/how-many-random-elements-before-md5-produces-collisions)讨论碰撞概率。 –

回答

2

这取决于你想要做什么。如果您希望邮件永远不会被有意篡改,那么即使是CRC64也可以。

如果您希望.NET提供的解决方案速度快,并且不提供加密安全性,那么MD5就好,并且可以满足您的需求。

如果您需要确定一条消息是否与另一条消息不同,并且您希望有人篡改传输中的数据,并且可能会使用位混搭技术修改以强制哈希冲突,则应该使用SHA-256或SHA-512。

冲突不应该是一个问题,除非您正在散列数十亿条消息或有人篡改传输中的数据。如果有人篡改传输中的数据,则会产生更大的问题。

+2

碰撞事件是为什么当没有这样的缺点的选项可用时,你会使用可能有一天会吹到你脸上的选项(即使可能性相反)? –

+0

@Puciek那么,即使SHA-512有碰撞的可能性。通常基于散列的搜索系统是从桶概念开发的。您有许多具有相同功能的项目,并且按照该散列进行分类,但未标识。然后你进行一次线性搜索,结果是一个O(1),然后一个O(N)的努力,但有一个比原来小得多的域。您必须权衡风险与回报并考虑预期的功能,然后定义错误条件以使事物处于该功能的范围内。这是所有优秀开发者的基础。 –

+0

@ MichaelJ.Gray这就是为什么我会建议在数据库级实现一个桶系统。在哈希上放一个索引来加快速度。最小的努力,最大的回报。 –

3

您可以按照Dictionary实现它的方式实现它。桶系统。

在数据库中有一个Hash值,并存储原始数据。

---------------- 
| Hash | Value | 
---------------- 

通过通过哈希查找第一查询会更快,如果有在某些时候是多次点击,一样会有与MD5,你可以遍历它们,并且更符合他们看如果他们真的是一样的。

但是,如Michael J. Gray所述,在较小的数据集上碰撞的可能性非常小。

+0

谢谢安德烈,如果我可以拆分接受的答案,那么我会 – CSharpNewBee

+0

@CSharpNewBee不要担心,很高兴我可以有一些帮助:) –

+0

@CSharpNewBee我会用upvote抵消它,因为这带来了bucketing在我之前。 –