2012-12-17 37 views
1

我想知道应该使用图像作为哈希集/字典键的图像大小。我也在考虑使用散列函数来达到这个目的,但我害怕散列冲突。我需要存储大约百万的图像。作为字典键的位图图像

+0

但是你有什么作为重点使用?第一个x字节数?如果图像大部分是相同的呢?然后你可能会发生很多碰撞,使得你的HashTable更像一个链表。更不用说,Equals函数是什么样子的?在碰撞的情况下,您是否必须比较*所有*字节以测试相等性?在我看来,要么有一个非常慢的散列函数(几乎没有碰撞),要么是一个非常快的散列函数,有很多冲突,还有一个非常慢的Equals函数。我同意@Roy Dictus:不要使用图像本身。 – aquinas

回答

0

位图图像作为关键?这不是一个好主意。散列码键应尽可能小,否则性能将受到严重影响。

你可以做的是从图像中计算一个散列值(比如SHA1),然后用它作为关键字。它只有20个字节,所以应该是一个好的尺寸,总比完整的位图图像好得多。

+0

不需要downvote这个答案,它是正确的!如果你做得不好,至少要有礼貌来解释原因。 –

2

无论您在HashSet或Dictionary中使用什么数据作为密钥,但您需要为其实施GetHashCodeEquals方法。

散列冲突不是问题。这只会将两个图像放在同一个桶中,并使用Equals方法来查找正确的图像。

1

给定图像的字节数,可以使用算法(如MD5或SHA1)为其计算散列值。

例与bytes为您的图片的字节数组:

using (var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider()) 
{ 
    var hash = Convert.ToBase64String(md5.ComputeHash(bytes)); 
    //Store hash 
}