使用散列函数时,我们的目的不是随机性吗?那么为什么我们不使用rand()
函数而不是对元素进行操作(如hashVal = 37*hashVal + key[i]
)?
答案 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根据对象的数据返回一个数字。所以是的,它确实提供了一个非常大的数字,但这个数字是基于对象本身的。
具有相同数据的相同对象(取决于散列函数)将返回相同的值。因此,就“随机性”而言,散列对于返回唯一数字并不理想。