哈希函数和取余运算符
Hash function and remainder operator
我有一个简单的问题一直困扰着我一段时间。我的教授只是说散列函数是 key % arraysize。每个散列 table 都必须这样,还是我们决定的?我们真的为我们创建的每个哈希 table 编写哈希函数吗?它可以是不同的东西吗,例如,简单地说,散列函数 = key.
通常,哈希函数的域比它的范围大得多。例如,哈希可能接受 "all unicode strings less then 2^64 characters long" 并输出 "a 16-bit number".
是的,对于一些应用程序,使用恒等函数作为散列函数是有意义的,尽管散列-table开始看起来很像一个普通数组。
对于 hash-tables 一般而言,模 (%
) 是一个不错的选择:它在计算上很容易,并且在通常情况下分布得很好。但是,它的加密强度并不高,而且很多应用程序都需要它。
你有一个数组来存储结果,它是固定大小并由索引引用(在你的问题中,index = key % array_size 保证产生 0 到array_size-1)。如果索引大于数组大小,就会出现问题。如果它总是小于那么你就浪费了 space 所以任何散列的最后阶段往往是它必须适应的数组大小的模数。
当然,这并不总是导致均匀分布,因此您可以在之前修改密钥,以其模数作为索引。
我有一个简单的问题一直困扰着我一段时间。我的教授只是说散列函数是 key % arraysize。每个散列 table 都必须这样,还是我们决定的?我们真的为我们创建的每个哈希 table 编写哈希函数吗?它可以是不同的东西吗,例如,简单地说,散列函数 = key.
通常,哈希函数的域比它的范围大得多。例如,哈希可能接受 "all unicode strings less then 2^64 characters long" 并输出 "a 16-bit number".
是的,对于一些应用程序,使用恒等函数作为散列函数是有意义的,尽管散列-table开始看起来很像一个普通数组。
对于 hash-tables 一般而言,模 (%
) 是一个不错的选择:它在计算上很容易,并且在通常情况下分布得很好。但是,它的加密强度并不高,而且很多应用程序都需要它。
你有一个数组来存储结果,它是固定大小并由索引引用(在你的问题中,index = key % array_size 保证产生 0 到array_size-1)。如果索引大于数组大小,就会出现问题。如果它总是小于那么你就浪费了 space 所以任何散列的最后阶段往往是它必须适应的数组大小的模数。
当然,这并不总是导致均匀分布,因此您可以在之前修改密钥,以其模数作为索引。