从“数据库系统基础”一书中可以看出:
内部哈希
对于内部文件,散列通常通过使用实现为哈希表 一组记录。假设数组索引范围从0到M-1,如 如图17.8(a)所示;然后我们有M个插槽,其地址对应于 数组索引。我们选择一个将哈希字段值转换为的哈希函数 0到M-1之间的整数。一个常见的哈希函数是h(K)= K mod M函数,返回divi后整数哈希字段值K的余数 M;然后将该值用于记录地址。 [...]
当正在插入的记录的哈希字段值哈希时发生冲突 到已包含不同记录的地址。
外部哈希
哈希磁盘文件称为外部哈希。适合磁盘的特性 存储,目标地址空间由桶组成,每个桶都有多个 记录。存储桶是一个磁盘块或一组连续的磁盘块。该 散列函数将一个键映射到一个相对的桶号,而不是分配一个 桶的绝对块地址。文件头中维护的表会转换 将桶号放入相应的磁盘块地址中,如图所示 图17.9。 存储桶的碰撞问题不那么严重,因为尽可能多的记录 在存储桶中可以散列到同一个存储桶而不会导致问题。
我有以下问题:
1)记录总是记录在一个块内,内部哈希也会返回块地址和块内记录的位置吗?
2)为什么外部哈希的碰撞问题不那么严重?我的意思是,假设每个块可以存储10条记录;我推测我将存储的文件包含100条记录,然后,使用外部哈希,我可能分配11-12个桶(我假设一个桶= 1块),因此哈希函数将返回10-12地址到桶。
如果我使用内部哈希,因为哈希函数返回一个直接地址,我会使用一个函数返回给我大约100-120个地址。
那么有什么区别?通过这种方式,我认为使用这两种方法具有相同的碰撞概率。
答案 0 :(得分:0)
正如我所理解的那样,你可以看看外部哈希'作为'打开哈希'。在开放哈希中,我们所做的是,哈希表中的每个成员都指向一个可以存储多个键的唯一列表。因此,当发生冲突时,将密钥输入到散列表元素指向的列表中。这样,碰撞的可能性就会降低(取决于列表的大小)。我发现这张幻灯片非常实用,看看(幻灯片编号30和32) - http://www.slideshare.net/gourab87/chapter13-8045092
答案 1 :(得分:0)
内部散列是一个包含散列键地址的数组。因此,每个数组索引只能包含一个哈希键的地址,因此如果另一个哈希键分配给该数组的相同索引,则会导致冲突。另一方面,外部散列主要是M的桶。每个桶可以占用多个散列密钥。因此,当铲斗装满时会发生碰撞。
答案 2 :(得分:0)
当本书的作者考虑内部哈希文件时,他们会考虑在主存储器中的文件上定义的哈希。他们在详细说明内部哈希时只考虑将元素分配给数组。此外,在编写内部哈希时,它们不会将记录放入块中,并且可能无意比较这两种哈希。我们对磁盘存储感兴趣的哈希是外部哈希。这应该是两个问题的答案。