为什么将其称为“哈希表”或“哈希函数”?在这里,哈希对我没有任何意义[关闭]


26

现在,我正在使用,聆听,讨论和实现哈希表和哈希函数大约需要4年的开发时间。但我真的不明白为什么将其称为哈希?

我记得我开始编程的第一天,这个术语对我来说有点繁琐。我从不知道它是什么,基于它的名字。我只是通过实验了解了它的作用以及为什么以及何时应该使用它

但是,有时我还是试图弄清楚为什么将其称为hash。我对函数没有问题,老实说,它们是相当演绎,合理的术语。但是,我认为可以使用更好的词来代替哈希,例如keyuniqueness。不要键入表唯一性表

根据我的字典,哈希表示:

  1. 土豆和肉类的炒菜(高度无关)
  2. #符号(又名数字符号,井号等)(仍然无关紧要,也许只是误称)
  3. 将算法应用于字符串(仍然与唯一性无关,这是哈希表的最重要特征)
  4. 切食物
  5. 大麻的另一个术语

有谁知道为什么将其称为哈希?


32
您似乎有点误解了什么是哈希。唯一性显然不是哈希函数的功能(即它们从不单射)。
彼得·泰勒

1
@Peter Taylor:哈希表确实定义了内射映射。
reinierpost 2011年

2
@Peter Taylor:有点挑剔,他们不需要是内射的,但有时他们甚至是双射的。考虑一个整数的哈希函数的典型实现:)
keppla 2011年

4
哈希可以是唯一的,只要密钥空间不大于哈希值空间(对于表哈希),或者哈希值空间大到在数学上不可行冲突(对于密码哈希)。
安全

1
同样,“键表”听起来更像是任何“键/值”数据结构(也称为“字典”)。并非所有键/值数据结构都是哈希表。
barjak 2011年

Answers:


46

根据维基百科,它指的是哈希函数。如果您想更进一步,则哈希函数的Wiki页面上说,哈希函数中单词“ hash”的使用起源如下:

术语“哈希”通过类比其非技术含义来“切碎并混合”。确实,典型的哈希函数(如mod操作)将输入域“砍”成许多子域,这些子域被“混入”到输出范围中以改善密钥分配的均匀性。


2
不确定“子域”在这里做什么。仅仅是散列函数彻底“混合”了其域的值。
reinierpost 2011年

15

在法语中,哈希表称为“ table de hach​​age”,相关动词“ hach​​er”是指切碎/切碎(主要是食物)。该动词to hash在英语中具有相同的含义。

因此,正如其他人指出的那样,它称为哈希,因为您将输入切成小块放在不同的位置(表项)。


2
它实际上写成“ hach​​age”和“ hach​​er”而没有任何口音。
2011年

10

3号与它有关。来自维基百科

哈希表算法的核心是一个简单的项目数组。这通常简称为哈希表。哈希表算法根据数据项的键计算索引,然后使用该索引将数据放入数组。这个计算的实施是哈希函数f

index = f(key, arrayLength)

哈希函数根据index数据计算数组内的keyarrayLength是数组的大小。对于汇编语言或其他低级程序,平凡的哈希函数通常可以仅使用一个或两个内联机器指令来创建索引。

因此,哈希表实际上并不存储基于键的值。它根据该键的哈希版本存储值。


1
这取决于您对哈希表的含义。Perl,Java和C#等语言提供的数据结构确实使用内部引用的哈希表为您提供了键到值的映射。
reinierpost 2011年

10

哈希表之所以这样称呼是因为使用了哈希码,它与“切菜”有关。

这样想-您将漂亮的漂亮对象(例如水果)拿走,然后对其进行哈希处理,使其开始看起来像其他任何东西-只是一个数字-里面不再有任何结构。哈希表中使用了那块“切好的食物”来找出您漂亮的漂亮对象。

  • 它看起来比您的漂亮物件还要丑吗?也许-但这有助于快速找到它-这就是重点。哦,这不是唯一的。
     
    哈希代码在表中找到一个存储桶,您的漂亮对象位于其他哈希值相同的公司中。在这家小公司中,使用相等性检查来查找对象-这比散列查找要慢得多,但这没什么大不了的,因为其中只有少数几个(由于快速散列,大多数其他对象已被忽略) 。

3

散列(如切成小块,切碎等)将获得输入(食物或有时是超级反面)并将其转换为相对均匀的输出。也就是说,无论您一开始所拥有的是什么,最终您都只能拥有哈希。一勺散列与确定所有输入(假设散列机散列效果很好)一样,与所有散列一样有用。
因此,哈希可以将任何可食用或邪恶的对象简化为一勺哈希,其中两个不同的对象产生不同的哈希,而两个相等的对象产生相同的哈希。这意味着,如果有两个超级坏蛋掉入您的哈希机中,则只需将它们的哈希值进行比较就可以确定一个是否为另一个的克隆。

从某种意义上说,计算机科学中的哈希函数有点相似。他们接受了大小和语义各异的整个输入,并且-非常简单地把它们切成小块,然后将它们混合在一起,然后将结果序列切成小块,然后将它们混合在一起,依此类推。最后,您将得到一匙(n个字节)的哈希输入。


但是,使用警告时,超级小人也可以使用给定的参数集返回与超级英雄相同的哈希值,因为哈希值似乎并不决定唯一性。毕竟有哈希冲突...它在冲突之后会做什么...
Rig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.