Hash 如何处理相同的哈希和相同的密钥?

Hash 如何处理相同的哈希和相同的密钥?,hash,logic,Hash,Logic,这个问题并不特定于任何编程语言,我更感兴趣的是泛型逻辑 通常,关联贴图会获取一个键并将其映射到一个值。据我所知,实现要求键是唯一的,否则值会被覆盖。好的 因此,让我们假设上面的操作是通过一些散列实现完成的。 如果两个不同的键得到相同的散列值呢?我以一个底层数组的形式来考虑这个问题,它的索引是对所述键进行散列的结果。可能会有多个唯一键映射到同一个值是吗?如果是,这样的实现如何处理这一问题? 处理同一散列与处理同一密钥有何不同?因为相同的键会导致覆盖,相同的哈希必须保留该值。 我了解哈希和冲突,所以

这个问题并不特定于任何编程语言,我更感兴趣的是泛型逻辑

通常,关联贴图会获取一个键并将其映射到一个值。据我所知,实现要求键是唯一的,否则值会被覆盖。好的

因此,让我们假设上面的操作是通过一些散列实现完成的。 如果两个不同的键得到相同的散列值呢?我以一个底层数组的形式来考虑这个问题,它的索引是对所述键进行散列的结果。可能会有多个唯一键映射到同一个值是吗?如果是,这样的实现如何处理这一问题? 处理同一散列与处理同一密钥有何不同?因为相同的键会导致覆盖,相同的哈希必须保留该值。
我了解哈希和冲突,所以我知道链接和探测。实现是否迭代散列到特定索引的当前值并确定键是否相同?
在搜索答案时,我发现了以下链接:
1.
2.

但是他们没有回答我的问题。我们如何区分相同的散列和相同的键呢?

您无法从索引中分辨出键是什么,因此您无法迭代这些值以查找有关键的任何信息。您必须保证0个冲突,或者存储散列后得到索引的信息


如果只有存储在结构中的值,则无法判断它们是否具有相同的键或只是相同的散列。您需要将密钥与要知道的值一起存储。

通过比较密钥。如果查看哈希映射的面向对象实现,您会发现它们通常需要在密钥类型上实现两种方法:

bool equal(Key key1, Key key2);
int hash(Key key);
如果只能给出hash函数,而没有相等函数,则限制hash映射基于语言的默认相等。这并不总是可取的,因为有时需要将键与不同的相等函数进行比较。例如,如果键是字符串,应用程序可能需要进行不区分大小写的比较,然后它将传递一个哈希函数,该函数在哈希之前转换为小写,并传递一个忽略大小写的相等函数

哈希映射将密钥存储在每个对应值旁边。(通常,这是指向最初存储的密钥对象的指针。)哈希映射中的任何查找都必须在找到匹配的哈希后进行密钥比较,以验证密钥是否确实匹配

例如,对于在每个bucket中存储列表的非常简单的哈希映射,该列表将是(键、值)对的列表,任何查找都会比较每个列表项的键,直到找到匹配项为止。在伪代码中:

Array<List<Pair<Key, Value>>> buckets;
Value lookup(Key k_sought) {
    int h = hash(k_sought);
    List<Pair<Key, Value>> bucket = buckets[h];
    for (kv in bucket) {
        Key k_found = kv.0;
        Value v_found = kv.1;
        if (equal(k_sought, k_found)) {
            return v_found;
        }
    }
    throw Not_found;
}
数组存储桶;
值查找(寻找k_键){
int h=散列(k_);
列表存储桶=存储桶[h];
用于(桶内kv){
发现的k_键=kv.0;
发现的v_值=kv.1;
if(相等(k_寻求,k_发现)){
返回找到的v_;
}
}
扔不到的东西;
}