什么是直方图的有效和高效的哈希码算法?

时间:2015-03-24 16:29:31

标签: image hash face-recognition lbph-algorithm

我有一个直方图,它是一个矢量/数字列表。什么是获得这种直方图的哈希码的简单有效的算法?哈希码只需要在哈希值上拆分图像,而不是比较图像。

此应用程序不关心安全性,因此加密功能不必要地慢。

2 个答案:

答案 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. 具有不同元素数量的列表的哈希码很可能不同。
  3. 具有相同元素数量的列表的哈希码更容易发生冲突。具有不同顺序的相同元素的列表将发生碰撞;不幸的是,列表[1,2][2,1]的哈希码相同。
  4. 这是一个很大的缺点,但并不像你最初想的那么大。哈希表实现了回退,它首先检查哈希码相等,然后检查总相等。如果排序的差异发生在列表的前面附近,则此后备检查很快。在最坏的情况下,它只需要进行多次比较就等于列表的长度。
  5. 总而言之,即使您使用每个直方图条目的数值作为其哈希码,这对于您的用例也是一个非常好的哈希函数。使用散列函数确实要避免的问题是常见的可分性,这意味着您希望散列函数的输出落入散列表的不同桶中。如果您需要更多信息,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中的哈希图已经有了不同的名字

containers.maps