使用散列函数时,我们的目的不是随机性吗?那么为什么我们不使用rand()
函数而不是对元素(如hashVal = 37*hashVal + key[i]
)进行操作呢?
4 回答
使用散列函数时,我们的目的不是随机性吗?
不。从技术上讲,我们使用散列函数的目的是将一个称为键的大型数据集映射到一组称为散列的值。散列函数可能不是唯一的,即多个键可能映射到同一个散列。但是,它必须始终将特定键映射到相同的散列。
例如,如果 hash("Hello, world") = 5,那么无论您对字符串散列多少次,它都必须始终为 5。因此,以您建议的方式使用 rand() 是行不通的,因为它每次都会将相同的键映射到不同的哈希值。
然而,一个好的散列函数确实会尝试将其键映射到随机散列,概率性地。这与随机数不同。这意味着,平均而言,每个散列具有大致相等数量的预散列。然而,每个键仍然每次都映射到自己的散列。
thb 的回答也说明了这一点。
哈希函数用于映射而不是随机数。所以我们不能在哈希使用的地方使用随机函数。哈希值在给定输入上始终是唯一的。
哈希函数的主要目标是加速查表或数据比较任务。
区别:
key = hash(A valid input)
, 关键是确定性输出
num = random(A valid input)
, num 是未确定的输出
好问题。这取决于随机是什么意思。
哈希将键映射到任意值——理想情况下映射到其中没有明显模式的值。例如:
'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 提出的问题。)
随机函数和散列函数之间有相似之处,它们都有一个确定的种子并返回一个值。
散列是根据对象的数据返回一个数字。所以是的,它通常会提供一个非常大的数字,但这个数字是基于对象本身的。
根据散列函数的不同,具有相同数据的相同对象将返回相同的值。正因为如此,就“随机性”而言,散列并不是返回唯一数字的理想选择。