介绍

散列是一种常用的数据存储技术,散列后的数据可以快速的插入或取用。散列所使用的数据结构叫散列表。
散列算法的作用是尽可能的在数据结构中找到一个值。
基本特点:插入,删除,取用数据都非常快,但是查询效率很低,如果你希望快速查找一般是借助其他的数据结构,比如二叉查找树。

示例

我们将要使用最常见的散列函 数——“lose lose”散列函数,方法是简单地将每个键值中的每个字母的ASCII值相加。
image.png

HashTable类

先实一个简单的散列函数,它是HashTable类中的一个私有方法:

  1. var loseloseHashCode = function (key) {
  2. var hash = 0; //存储ASCII总和
  3. for (var i = 0; i < key.length; i++) { //对key值遍历
  4. hash += key.charCodeAt(i); //计算每个字符的ASCII值相加
  5. }
  6. return hash % 37; //和任意数做除法
  7. };

完整代码

  1. class hashTable {
  2. constructor() {
  3. this.table = new Array(7);
  4. }
  5. put(key) {
  6. let pos = this.loseloseHashCode(key);
  7. this.table[pos] = key;
  8. }
  9. get(key) {
  10. return table[loseloseHashCode(key)];
  11. }
  12. remove(key) {
  13. table[loseloseHashCode(key)] = undefined;
  14. }
  15. showDistro() {
  16. let n = 0;
  17. for (let i = 0, len = this.table.length; i < len; ++i) {
  18. if (this.table[i] !== 'undefined') {
  19. console.log(`${i}:${this.table[i]}`)
  20. }
  21. }
  22. }
  23. loseloseHashCode(key) {
  24. var hash = 0;
  25. for (var i = 0; i < key.length; i++) {
  26. hash += key.charCodeAt(i);
  27. }
  28. console.log('hashValue:' + hash)
  29. return hash % this.table.length;
  30. }
  31. }
  32. let dataa = ['Clayton', 'Raymond', 'kitty', 'Miachale'];
  33. let htable = new hashTable();
  34. dataa.forEach(item=>{
  35. htable.put(item)
  36. })
  37. htable.showDistro()
  38. //执行结果
  39. hashValue:730
  40. hashValue:730
  41. hashValue:565
  42. hashValue:788
  43. 0:undefined
  44. 1:undefined
  45. 2:Raymond
  46. 3:undefined
  47. 4:Miachale
  48. 5:kitty
  49. 6:undefined

结论:simpleHash在计算某些值的哈希值时,会有键一样而丢失的情况,那么需要一个更好的散列函数。