JavaScript的散列函数问题

    var loseloseHashCode = function (key) {
        var hash = 0;
        for (var i = 0; i < key.length; i++) {
            hash += key.charCodeAt(i);
        }
        return hash % 37;
    };
    
    this.put = function(key, value) {
        var position = loseloseHashCode(key); //{5}
        console.log(position + ' - ' + key); //{6}
        table[position] = value; //{7}
    };

问题:看到某本书上的散列函数最后return hash %37,我测试这样会出现覆盖啊。比如当key='Abc'key='fbc'的时候,因为Abc的ASCII码值之和=262,而fbc的ASCII值之和=299。他们两个各自Mod37=3。所以都会在position=3这个位置上插入一个值,最后结果产生覆盖。书上上是为了比较小的数值,但这样会产生覆盖啊,这样是散列函数的本义吗?

阅读 1.5k
1 个回答

可能是为就是为了单纯举个例子吧,冲突是不可避免的,有解决冲突的相应方法


冲突

  • 数组不可能无限长,生成的索引相同会产生冲突。

解决方法

  • 拉链法,索引存链表,链表中存键和值和next。同时又有一个问题,散列函数的重要性,应将所有的键均匀映射。
  • 拉链法变种,不存链表,存树或hash表。
  • 开放寻址,冲突则找下一个不冲突的位置,在满容后会进行扩容。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题