¿Existen algoritmos hash conocidos que ingresan un vector de int y producen un int único que funciona de manera similar a un producto interno?¿Maneras de hash un vector numérico?
En otras palabras, estoy pensando en un algoritmo de hash que podría tener este aspecto en C++:
// For simplicity, I'm not worrying about overflow, and assuming |v| < 7.
int HashVector(const vector<int>& v) {
const int N = kSomethingBig;
const int w[] = {234, 739, 934, 23, 828, 194}; // Carefully chosen constants.
int result = 0;
for (int i = 0; i < v.size(); ++i) result = (result + w[i] * v[i]) % N;
return result;
}
estoy interesado en esto porque estoy escribiendo un papel en un algoritmo que se beneficiarían de cualquier trabajo previo en hashes similares. En particular, sería genial si se conoce algo sobre las propiedades de colisión de un algoritmo hash como este.
El algoritmo en el que estoy interesado consistiría en hash vectores enteros, pero algo para los vectores float también sería genial.
Aclaración
El hash es para uso en una tabla hash para las búsquedas de clave/valor rápidas. No hay preocupación de seguridad aquí.
La respuesta deseada es algo así como un conjunto de constantes que probablemente funcionan especialmente bien para un hash como este, análogo a un multiplicador y módulo que funciona mejor que otros como un generador de números pseudoaleatorio.
Por ejemplo, algunas elecciones de constantes para un generador pseudoaleatorio congruente lineal son conocidas por proporcionar longitudes de ciclo óptimas y tener módulos fáciles de calcular. Tal vez alguien ha hecho una investigación para mostrar que un cierto conjunto de constantes multiplicativas, junto con una constante de módulo, en un hash vectorial puede reducir la posibilidad de colisiones entre los vectores enteros cercanos.
¿Qué sabe o asume acerca de la distribución de los valores de entrada? Su ejemplo parece que son todos menores de 1000. –
Dado que el objetivo es encontrar referencias para un artículo, probablemente las suposiciones que hagan sean probablemente correctas. Por cierto, las constantes inventadas en el ejemplo no son entradas, sino constantes en el algoritmo. No especifiqué ningún valor de entrada real en ese ejemplo. – Tyler
¿Ha considerado usar una o más de las siguientes funciones hash de propósito general: http://www.partow.net/programming/hashfunctions/index.html son extremadamente rápidas y eficientes. –