我们对哈希的目的

时间:2012-12-29 21:54:45

标签: hash

使用散列函数时,我们的目的不是随机性吗?那么为什么我们不使用rand()函数而不是对元素进行操作(如hashVal = 37*hashVal + key[i])?

4 个答案:

答案 0 :(得分:2)

  

使用散列函数时,我们的目的不是随机性吗?

没有。从技术上讲,我们使用散列函数时的目的是将一个名为keys的值的大数据集映射到一组称为散列的值。哈希函数可能不是唯一,也就是说,多个键可以映射到相同的哈希。但是,它必须始终将特定键映射到同一个哈希。

例如,如果hash(“Hello,world”)= 5,那么无论您对字符串进行散列多少次,它都必须始终为5。因此,以你建议的方式使用rand()将不起作用,因为它会每次将相同的键映射到不同的哈希值。

然而,一个好的散列函数会尝试将其键映射到随机散列,概率。这与随机数不同。这意味着,平均而言,每个哈希值具有大致相等的预哈希值。但是,每次键都仍然映射到它自己的哈希值。

这个答案也说明了这一点。

答案 1 :(得分:1)

哈希函数用于映射而不是随机数。所以我们不能使用哈希使用的随机函数。哈希值在给定输入上始终是唯一的 Hash函数的主要目标是加速表查找或数据比较任务。

差异:

key = hash(A valid input),关键是确定性输出

num = random(A valid input),num是未确定的输出

答案 2 :(得分:1)

好问题。这取决于 random意味着什么。

哈希将键映射到任意值 - 理想情况下是没有模式明显的值。例如:

'A' => 15
'B' => 97
'C' => 43
'D' => 60
'E' => 41

但是,散列始终将相同的键映射到相同的值。因此:

"BED"  => [97 41 60]
"BEDE" => [97 41 60 41]

每次您给哈希'E'时,它总是将其哈希为41,而不是另一个值。

附加说明

虽然次要的讨论是哈希不需要承担独特的价值,但显着。例如,这是可能的:

'F' => 41

因此,给定散列值41,无法确定密钥是'E'还是'F'

(所有这一切自然地暗示了一个问题:“很好。但是什么是哈希”然而这又是另一个问题,而不是OP提出的问题。)

答案 3 :(得分:0)

随机函数和散列函数之间存在相似之处,两者都有一个确定的种子并返回一个值。

Hashing根据对象的数据返回一个数字。所以是的,它确实提供了一个非常大的数字,但这个数字是基于对象本身的。

具有相同数据的相同对象(取决于散列函数)将返回相同的值。因此,就“随机性”而言,散列对于返回唯一数字并不理想。