我有一个直方图,它是一个矢量/数字列表。什么是获得这种直方图的哈希码的简单有效的算法?哈希码只需要在哈希值上拆分图像,而不是比较图像。
此应用程序不关心安全性,因此加密功能不必要地慢。
答案 0 :(得分:0)
散列列表的方法是组合每个项目的散列。 implements the hash function的Java list就像这样:
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}
值得注意的属性:
1
。[1,2]
和[2,1]
的哈希码相同。总而言之,即使您使用每个直方图条目的数值作为其哈希码,这对于您的用例也是一个非常好的哈希函数。使用散列函数确实要避免的问题是常见的可分性,这意味着您希望散列函数的输出落入散列表的不同桶中。如果您需要更多信息,Wikipedia article将涵盖良好哈希函数的属性。
要获得更好的数字列表哈希码,我们应该查看better hash code for an individual number,特别是this answer。
unsigned int hash(unsigned int[] list) {
unsigned int hashCode = 0;
for (int i = 1; i < list.length; i++) {
hashCode = hashCode + list[i];
hashCode = ((hashCode >> 16) ^ hashCode) * 0x45d9f3b;
hashCode = ((hashCode >> 16) ^ hashCode) * 0x45d9f3b;
hashCode = ((hashCode >> 16) ^ hashCode);
}
return hashCode;
}
我认为这是一个很好的改编,但我并不期望。
关于溢出效率,除非您必须处理异常,否则它不是主要的减速。在Java中,arithmetic will never throw an overflow exception,而不是将其包装到最小值或最大值。只要哈希表的实现支持哈希码,就没有真正的缺点。
答案 1 :(得分:0)
我可能无法正确理解你的问题,但是matlab中的哈希图已经有了不同的名字