哈希文件组织和哈希索引组织有什么区别?
What differences are between a hash file organization and a hash index organization?
来自数据库系统概念
Hashing can be used for two different purposes.
In a hash file organization, we obtain the address of the disk block containing a desired record directly by computing a function on the
search-key value of the record.
In a hash index organization we organize the search keys, with their associated pointers, into a hash file structure.
"a hash file structure"是什么意思?
我不太确定,所以我不确定哈希文件组织和哈希索引组织之间有什么区别。
你能展示或改写一下它们分别是什么吗?
假设您有两条记录,一条带有关键字 "foo",一条带有关键字 "bar"。假设记录的长度固定为 64 字节,"foo" 散列为 0x4000,"bar" 散列为 0x0100。
在 "hash file organization" 中,您有一个获取搜索关键字并直接计算地址的函数。因此,如果将 "foo" 和 "bar" 添加到文件中,则 "foo" 的记录将在文件中从地址 0x4000 开始,而 "bar" 记录将从文件中的地址 0x0100 开始文件。
文件看起来像这样:
Address Range Contents
------------- --------
0x0000 - 0x00FF empty space
0x0100 - 0x013F "bar" record
0x0140 - 0x3FFF empty space
0x0400 - 0x403F "foo" record
在 "hash index organization" 中,您有一个辅助数据结构——索引——告诉您特定记录的起始位置。假设文件是空的,你添加 "foo"。您的哈希函数计算出的值为 0x4000。您将其添加到索引(哈希映射或类似的东西)中,并且由于文件是空的,因此分配的值为 0。当您添加第二条记录时,"bar",将添加 0x0100 的哈希键,并且分配的值为 0x0040。您有一个索引:
Key Value
-------------
0x0100 0x0040
0x4000 0x0000
文件如下所示:
Address Range Contents
-----------------------------
0x0000 - 0x003F "foo" record
0x0040 - 0x007F "bar" record
当然,您必须将索引存储在某处。它可以在一个单独的文件中,或者可能在数据文件的前面或后面,或者分散在整个文件中。很多不同的可能性。
第一种情况,文件中有很多浪费space,但是你可以直接查找记录的位置:哈希键,结果是记录的地址。
在第二种情况下,您对键进行哈希处理,然后在索引中查找结果以获得记录的键。这里的主要优点是它可能会在文件中节省大量 space,但是您会遇到存储索引的问题。
无论哪种情况,您都必须有一些解决哈希冲突的方法。
来自数据库系统概念
Hashing can be used for two different purposes.
In a hash file organization, we obtain the address of the disk block containing a desired record directly by computing a function on the search-key value of the record.
In a hash index organization we organize the search keys, with their associated pointers, into a hash file structure.
"a hash file structure"是什么意思?
我不太确定,所以我不确定哈希文件组织和哈希索引组织之间有什么区别。 你能展示或改写一下它们分别是什么吗?
假设您有两条记录,一条带有关键字 "foo",一条带有关键字 "bar"。假设记录的长度固定为 64 字节,"foo" 散列为 0x4000,"bar" 散列为 0x0100。
在 "hash file organization" 中,您有一个获取搜索关键字并直接计算地址的函数。因此,如果将 "foo" 和 "bar" 添加到文件中,则 "foo" 的记录将在文件中从地址 0x4000 开始,而 "bar" 记录将从文件中的地址 0x0100 开始文件。
文件看起来像这样:
Address Range Contents
------------- --------
0x0000 - 0x00FF empty space
0x0100 - 0x013F "bar" record
0x0140 - 0x3FFF empty space
0x0400 - 0x403F "foo" record
在 "hash index organization" 中,您有一个辅助数据结构——索引——告诉您特定记录的起始位置。假设文件是空的,你添加 "foo"。您的哈希函数计算出的值为 0x4000。您将其添加到索引(哈希映射或类似的东西)中,并且由于文件是空的,因此分配的值为 0。当您添加第二条记录时,"bar",将添加 0x0100 的哈希键,并且分配的值为 0x0040。您有一个索引:
Key Value
-------------
0x0100 0x0040
0x4000 0x0000
文件如下所示:
Address Range Contents
-----------------------------
0x0000 - 0x003F "foo" record
0x0040 - 0x007F "bar" record
当然,您必须将索引存储在某处。它可以在一个单独的文件中,或者可能在数据文件的前面或后面,或者分散在整个文件中。很多不同的可能性。
第一种情况,文件中有很多浪费space,但是你可以直接查找记录的位置:哈希键,结果是记录的地址。
在第二种情况下,您对键进行哈希处理,然后在索引中查找结果以获得记录的键。这里的主要优点是它可能会在文件中节省大量 space,但是您会遇到存储索引的问题。
无论哪种情况,您都必须有一些解决哈希冲突的方法。