📜  DBMS-哈希

📅  最后修改于: 2021-01-11 06:21:05             🧑  作者: Mango


对于庞大的数据库结构,几乎不可能通过其所有级别搜索所有索引值,然后到达目标数据块以检索所需数据。散列是一种有效的技术,可以在不使用索引结构的情况下计算磁盘上数据记录的直接位置。

哈希使用带有搜索键作为参数的哈希函数来生成数据记录的地址。

哈希组织

  • 存储桶-哈希文件以存储桶格式存储数据。桶被视为存储单位。存储桶通常存储一个完整的磁盘块,而该磁盘块又可以存储一个或多个记录。

  • 哈希函数-哈希函数h是一个映射函数,它将所有搜索键K映射到放置实际记录的地址。这是从搜索键桶地址的函数。

静态散列

在静态哈希中,当提供搜索键值时,哈希函数总是计算相同的地址。例如,如果使用mod-4哈希函数,则它将仅生成5个值。输出地址将永远是相同的该函数。提供的铲斗数量始终保持不变。

静态散列

操作方式

  • 插入-当要求使用静态哈希输入记录时,哈希函数h计算将存储记录的搜索关键字K的存储桶地址。

    桶地址= h(K)

  • 搜索-当需要检索记录时,可以使用相同的哈希函数来检索存储数据的存储桶的地址。

  • 删除-这只是一个搜索,然后进行删除操作。

铲斗溢出

铲斗溢出的情况称为碰撞。对于任何静态哈希函数,这都是致命的状态。在这种情况下,可以使用溢出链。

  • 溢出链接-当存储桶已满时,将为相同的哈希结果分配一个新存储桶,并在前一个存储桶之后进行链接。此机制称为“封闭哈希”

溢出链

  • 线性探测-当哈希函数生成已存储数据的地址时,将为其分配下一个空闲存储桶。这种机制称为开放哈希

线性探测

动态散列

静态哈希的问题在于它不会随着数据库大小的增长而动态扩展或缩小。动态哈希提供了一种机制,在该机制中,可以按需动态添加和删除数据存储桶。动态哈希也称为扩展哈希

在动态散列中,散列函数可产生大量值,并且最初只使用少数几个。

动态散列

组织

整个哈希值的前缀用作哈希索引。哈希值的仅一部分用于计算存储桶地址。每个哈希索引都有一个深度值,以表示有多少位用于计算哈希函数。这些位可以寻址2n个存储桶。当所有这些位都被消耗时(即,当所有存储桶都已满时),深度值将线性增加,并且分配了两次存储桶。

操作方式

  • 查询-查看哈希索引的深度值,并使用这些位来计算存储桶地址。

  • 更新-执行上述查询并更新数据。

  • 删除-执行查询以查找所需数据并将其删除。

  • 插入-计算存储桶的地址

    • 如果存储桶已满。
      • 添加更多的存储桶。
      • 将其他位添加到哈希值。
      • 重新计算哈希函数。
    • 其他
      • 将数据添加到存储桶中
    • 如果所有存储桶都已满,请执行静态哈希处理。

当数据以某种顺序组织并且查询需要一定范围的数据时,散列是不利的。当数据是离散的和随机的时,散列效果最佳。

散列算法比索引具有更高的复杂度。所有哈希操作均在固定时间内完成。