【问题标题】:Universal hashing, should get the same hash value for the same key?通用散列,应该为同一个键获得相同的散列值吗?
【发布时间】:2016-01-12 00:48:24
【问题描述】:

我的意思是,我已经使用这个表达式实现了一个通用散列函数:

h(k) = ((a*k + b)mod p)mod m; (来自科门)

在哪里: -p 是大于 k 的大素数; -a 和 b 是随机选择的两个数字,第一个在 [1, p-1] 范围内,第二个在 [0, p-1] 范围内随机选择。

现在,我实现了这个,对于随机函数,我选择了等于 k ​​的种子。那是因为,如果我不这样做,当我用键 k 插入一个值时,它会生成一个哈希值,这将取决于 Random 函数的默认种子(可能是时间)。所以如果我想再次搜索密钥,我不能这样做,因为现在通用散列函数返回了另一个值。所以,我很感激你告诉我我的推理是否正确。 我的疑问是,现在这样做,如果两个元素具有相同的键,它们将被无条件地存储在同一个链表中(我不明白它是否正确)。

提前致谢。

【问题讨论】:

    标签: hash hashtable universal


    【解决方案1】:

    我认为您对通用哈希的工作原理有一点误解。不要在每次计算散列时随机选择ab,而是在进行任何散列之前,随机选择ab。完成此操作后,每次需要计算哈希时,请根据输入值 k 以及您最初选择的值 ab 使用上面的公式进行计算。

    【讨论】:

    • 感谢您的回答!无论如何,这样做,如果我插入例如 100 个元素,每次这两个常量都一样,对吧?
    • 你成就了我的一天。谢谢。
    • 我可以再问你一个问题吗?如何检查插入是否在 O(1) 时间内完成?例如,我用一些插入测试我的哈希表,我计算插入的时间,但是,我怎么能说它是在 O(1) 中完成的?谢谢。
    猜你喜欢
    • 2019-03-17
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多