【发布时间】:2018-12-22 04:17:26
【问题描述】:
在课堂上被教导如何创建哈希表后,我不明白哈希数据何时有用。在我看来,所有散列方法都是将信息存储在数组中的半随机位置。我想知道任何数据在存储后如何变得有用。
我的问题是:有哪些散列信息有益的例子?如何以任何有组织的方式检索数据?它似乎被放置在难以检索的任意位置。
【问题讨论】:
标签: hash
在课堂上被教导如何创建哈希表后,我不明白哈希数据何时有用。在我看来,所有散列方法都是将信息存储在数组中的半随机位置。我想知道任何数据在存储后如何变得有用。
我的问题是:有哪些散列信息有益的例子?如何以任何有组织的方式检索数据?它似乎被放置在难以检索的任意位置。
【问题讨论】:
标签: hash
散列可用于多种用途:
可用于比较大量数据。您为数据创建哈希值,存储哈希值,然后如果您想比较数据,只需比较哈希值。
哈希可用于索引数据。它们可以在哈希表中用于指向正确的行。如果你想快速找到一条记录,你计算数据的hash,直接去对应hash记录所指向的记录。 (这假设您有一个指向实际记录的哈希排序列表)
它们可用于数字签名等加密应用。
散列可用于生成看似随机的字符串。
以下是维基百科列出的哈希函数的应用:
现在关于哈希表,这里有几点需要注意:
如果您使用的是散列表,表中的散列应该是有序的。如果没有,您将不得不在哈希列上创建一个索引。一些实现以排序的方式单独存储哈希并指向原始记录。
如果有人以半随机顺序存储哈希,那一定是由于上述原因,或者因为他们只想存储信息的消息摘要以进行比较、查找重复等,而不是作为索引数据。
【讨论】:
您在课堂上创建的哈希表的主要用途之一是当您需要快速 O(1) 查找时间时。您将有两个组件,键和值。
散列函数将键转换为散列。该哈希是一个数字,具体来说,它是数组中数据的索引。
因此,当您需要在哈希表中查找 Agscala 的声誉并且您已使用您的用户名作为键时,几乎不需要任何时间来定位和找到相关值。它只是重新散列您的用户名和中提琴,这是您要查找的数据的索引。您不必遍历整个数组来查找该特定值。
对于一些参考,Hash tables 上的维基百科页面非常好。
【讨论】:
哈希数据有几个典型的原因。在您引用的示例中,您将散列数据并将其用作键来提取散列项的实际值。散列后的数据通常被称为键,它引用一个可以找到实际非散列值的存储桶。
另一个典型的原因是创建散列值的签名,以便您可以检查该值是否已被其他人更改。由于根据所使用的算法,将两个项目哈希到相同的值通常很少见,您可以重新哈希一个值并将其与保存的哈希值进行比较,以检查该项目是否仍然相同。
【讨论】:
散列是一种用于快速键查找的技术。它允许人们更有效地找到一个值,而不是从头到尾扫描一个列表。
【讨论】:
你用过字典或集合吗?它们通常以哈希表的形式实现,因为可以快速找到与键关联的值。
{
'WA': 'Washington',
'WV': 'West Virginia',
'WY': 'Wyoming'
}
【讨论】: