- 它们是什么以及如何工作?
- 它们在哪里使用?
- 我何时应该(不)使用它们?
我一遍又一遍地听到这个词,但我不知道它的确切含义。
我听说它们通过将数组键发送到哈希函数中,将其转换为整数,然后使用常规数组来允许关联数组。我的理解正确吗?
(注意:这不是我的作业;我去上学,但他们只教我们计算机基础知识)
我一遍又一遍地听到这个词,但我不知道它的确切含义。
我听说它们通过将数组键发送到哈希函数中,将其转换为整数,然后使用常规数组来允许关联数组。我的理解正确吗?
(注意:这不是我的作业;我去上学,但他们只教我们计算机基础知识)
维基百科 对于“散列表(Hash Table)”有一个很好的解释。
当您希望通过某个索引查找值时,应使用散列表。
至于何时不应使用它们... 当您不想通过某个索引查找值时(例如,如果您只想迭代访问它们),就不需要使用。
好的哈希函数是一种单向函数,它允许您从任何给定的输入创建分布式值。因此,您将为每个输入值获得相对唯一的值。它们也是可重复的,这意味着任何输入都将始终生成相同的输出。
一个好的哈希函数的例子是SHA1或SHA256。
假设您有一个用户数据库表。列是id
、last_name
、first_name
、telephone_number
和address
。
虽然这些列中的任何一个都可能有重复项,但我们假设没有行完全相同。
在这种情况下,id
只是我们制作的唯一主键(代理键)。id字段实际上不包含任何用户数据,因为我们找不到一个对于用户来说是唯一的自然键,但我们使用id字段来构建与其他表的外键关系。
我们可以像这样从我们的数据库中查找用户记录:
SELECT * FROM users
WHERE last_name = 'Adams'
AND first_name = 'Marcus'
AND address = '1234 Main St'
AND telephone_number = '555-1212';
我们必须通过4个不同的列,使用4个不同的索引来查找我的记录。
然而,您可以创建一个新的“哈希”列,并存储所有四个列组合的哈希值。
String myHash = myHashFunction("Marcus" + "Adams" + "1234 Main St" + "555-1212");
你可能会得到一个类似于 AE32ABC31234CAD984EA8
的哈希值。
你可以将这个哈希值作为数据库中的一列并在其上建立索引。现在你只需要搜索一个索引。
SELECT * FROM users
WHERE hash_value = 'AE32ABC31234CAD984EA8';
一旦我们获得所请求用户的ID,我们可以使用该值在其他表中查找相关数据。
这个想法是哈希函数可以卸载数据库服务器的工作。
碰撞不太可能发生。如果两个用户具有相同的哈希值,则很可能它们具有重复的数据。