Además de secuencias, también puede codificar conjuntos. Es decir, conjuntos de objetos sin orden en ellos. Se calcula según la siguiente fórmula:
hash(A) = \(\sum_{a \in A} p^{ord(a)}\) <- contando todo módulo
donde ord es una función que asigna a un objeto del conjunto su número ordinal absoluto entre todos los objetos posibles (por ejemplo, si los objetos son números naturales, entonces ord(x) = x, y si son letras latinas minúsculas, entonces ord(& #39;a' ;) = 1, ord('b') = 2 etc.)
Es decir, para cada objeto asociamos un valor igual a la base de la potencia del número de este objeto y sumamos todos estos valores para obtener un hash de todo el conjunto. Como se desprende claramente de la fórmula, el hash se vuelve a calcular fácilmente si se agrega o elimina un elemento del conjunto (simplemente agregue o reste el valor requerido). Misma lógica, si no se agregan o eliminan elementos individuales, sino otros conjuntos (solo agregue / reste su hash).
Como ya puede comprender, los elementos individuales se consideran conjuntos de tamaño 1, para los cuales podemos calcular el hash. Y los conjuntos más grandes son simplemente una unión de tales conjuntos individuales, donde al combinar conjuntos, agregamos sus valores hash.
De hecho, sigue siendo el mismo hash polinomial, pero antes del coeficiente en pm , teníamos el valor del elemento de secuencia bajo el número n - m - 1 (donde n es la longitud de la secuencia), y ahora este es el número de elementos en el conjunto cuyo número ordinal absoluto es igual a m.
En dicho hash, se debe tomar una base suficientemente grande (más grande que el tamaño máximo del conjunto) o usar hash doble para evitar situaciones en las que un conjunto de p objetos con un número ordinal absoluto m tenga el mismo hash que un conjunto con un objeto con valor absoluto. número ordinal m+1.