除了序列之外,您还可以散列集。也就是说,没有顺序的对象集。根据以下公式计算:
hash(A) = \(\sum_{a \in A} p^{ord(a)}\) <- 对所有事物进行模数计算
其中 ord 是一个函数,它将所有可能对象中的绝对序数分配给集合中的一个对象(例如,如果对象是自然数,则 ord(x) = x,如果是小写拉丁字母,则 ord(& #39;a' ;) = 1, ord('b') = 2 等)
也就是说,对于每个对象,我们将一个等于基数的值与该对象的数量次方相关联,并将所有这些值相加,以获得整个集合的哈希值。从公式中可以清楚地看出,如果将元素添加到集合或从集合中删除(只需添加或减去所需的值),则很容易重新计算哈希。同样的道理, 如果不是添加或删除单个元素,而是添加或删除其他集合(只需添加/减去它们的散列)。
正如您已经了解的那样,单个元素被视为大小为 1 的集合,我们可以为其计算哈希。更大的集合只是这些单个集合的并集,通过组合集合,我们添加它们的哈希值。
事实上,这仍然是相同的多项式哈希,但在 pm 处的系数之前,我们有值数 n - m - 1 下的序列元素(其中 n 是序列的长度),现在这是集合中绝对序数等于 m 的元素数。
在这种散列中,必须采用足够大的基数(大于最大集合大小),或者使用双重散列来避免出现绝对序数为 m 的一组 p 个对象与具有一个绝对序数的对象的集合具有相同散列的情况序数 m+1.