Hướng dẫn what is hash key in javascript? - khóa băm trong javascript là gì?

Hướng dẫn what is hash key in javascript? - khóa băm trong javascript là gì?

Các bảng Hash là một cấu trúc dữ liệu cho phép bạn tạo một danh sách các giá trị được ghép nối. Sau đó, bạn có thể truy xuất một giá trị nhất định bằng cách sử dụng khóa cho giá trị đó mà bạn đặt vào bảng trước.

Bảng băm biến một phím thành một chỉ mục số nguyên bằng hàm băm và chỉ mục sẽ quyết định nơi lưu trữ cặp khóa/giá trị trong bộ nhớ:

Hướng dẫn what is hash key in javascript? - khóa băm trong javascript là gì?
Bảng băm để lưu trữ danh bạ điện thoại (từ Wikipedia)

Bạn sẽ thường sử dụng bảng băm vì các hoạt động tìm kiếm, chèn và xóa nhanh của nó:

Độ phức tạp về thời gian băm trong ký hiệu lớn o
Thuật toánTrung bìnhTrường hợp xấu nhất
Không gianTrên)Trên)
Tìm kiếmO (1)Trên)
Tìm kiếmO (1)Trên)
Tìm kiếmO (1)Trên)

Tìm kiếm

O (1)

Chèn

Xóa bỏ

Nguồn từ Wikipedia

Hướng dẫn này sẽ giúp bạn hiểu việc triển khai bảng băm trong JavaScript cũng như cách bạn có thể xây dựng lớp bảng băm của riêng mình.

Đầu tiên, chúng ta hãy xem các lớp
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 và
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 của JavaScript.

Cách sử dụng các bảng băm với các lớp đối tượng và bản đồ trong JavaScript

  • Ví dụ phổ biến nhất về bảng băm trong JavaScript là kiểu dữ liệu
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    5, trong đó bạn có thể ghép giá trị thuộc tính của đối tượng với khóa thuộc tính.
  • Trong ví dụ sau, khóa
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    8 được ghép nối với giá trị số điện thoại là
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    9 và khóa
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection.set("Jane", "555-0182");
    
    console.log(collection.get("Nathan")); // 555-0182
    console.log(collection.size); // 2
    0 được ghép nối với giá trị
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection.set("Jane", "555-0182");
    
    console.log(collection.get("Nathan")); // 555-0182
    console.log(collection.size); // 2
    1:

Đối tượng

let obj = {
  Nathan: "555-0182",
  Jane: "315-0322"
}
JavaScript là một ví dụ về triển khai bảng băm

Nhưng loại
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 của JavaScript là một loại thực hiện bảng băm đặc biệt vì hai lý do:

Nó có các thuộc tính được thêm bởi lớp

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5. Các khóa của bạn nhập có thể xung đột và ghi đè các thuộc tính mặc định được kế thừa từ lớp.

Kích thước của bảng băm không được theo dõi. Bạn cần đếm thủ công số lượng thuộc tính được định nghĩa bởi lập trình viên thay vì được thừa hưởng từ nguyên mẫu.

Ví dụ: nguyên mẫu

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 có phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection.set("Jane", "555-0182");

console.log(collection.get("Nathan")); // 555-0182
console.log(collection.size); // 2
5 cho phép bạn kiểm tra xem thuộc tính không được kế thừa:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
JavaScript đối tượng Phương thức kế thừa Ví dụ cuộc gọi

JavaScript không chặn nỗ lực ghi đè lên phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection.set("Jane", "555-0182");

console.log(collection.get("Nathan")); // 555-0182
console.log(collection.size); // 2
5, điều này có thể gây ra lỗi như thế này:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
JavaScript Thuộc tính kế thừa đối tượng bị ghi đè

Để xử lý những thiếu sót này, JavaScript đã tạo ra một triển khai khác của cấu trúc dữ liệu bảng Hash được gọi là

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6

Giống như
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5,
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 cho phép bạn lưu trữ các cặp giá trị khóa bên trong cấu trúc dữ liệu. Đây là một ví dụ về
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 trong hành động:

const collection = new Map();

collection.set("Nathan", "555-0182");
collection.set("Jane", "555-0182");

console.log(collection.get("Nathan")); // 555-0182
console.log(collection.size); // 2
JavaScript Lớp bản đồ là một triển khai khác của bảng băm

Không giống như loại

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5,
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 yêu cầu bạn sử dụng các phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để xác định và truy xuất bất kỳ giá trị cặp chính nào mà bạn muốn được thêm vào cấu trúc dữ liệu.

Bạn cũng không thể ghi đè lên các thuộc tính được kế thừa
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6. Ví dụ: mã sau đã cố gắng ghi đè giá trị thuộc tính
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
6 thành
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
7:

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
Map Loại thuộc tính không thể ghi đè

Như bạn có thể thấy từ mã ở trên, bạn không thể thêm một mục nhập mới vào đối tượng const obj = {}; obj.name = "Nathan"; obj.hasOwnProperty = true; console.log(obj.hasOwnProperty("name")); // Error: obj.hasOwnProperty is not a function6 mà không cần sử dụng phương thức const collection = new Map(); collection.set("Nathan", "555-0182"); collection["size"] = false; console.log(collection.get("size")); // undefined console.log(collection.size); // 13.

Cấu trúc dữ liệu

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 cũng có thể lặp lại, có nghĩa là bạn có thể lặp lại dữ liệu như sau:

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
Idering thông qua một đối tượng bản đồ

  • Bây giờ bạn đã học được cách thực hiện các bảng băm JavaScript dưới dạng cấu trúc dữ liệu
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    5 và
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    6, hãy xem cách bạn có thể tạo triển khai bảng băm của riêng mình tiếp theo.
  • Cách thực hiện cấu trúc dữ liệu bảng băm trong JavaScript
  • Mặc dù JavaScript đã có hai triển khai bảng băm, nhưng việc viết triển khai bảng băm của riêng bạn là một trong những câu hỏi phỏng vấn JavaScript phổ biến nhất.

Bạn có thể triển khai bảng băm trong JavaScript trong ba bước:

Tạo một lớp
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 với các thuộc tính ban đầu
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
4 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
6

Thêm hàm

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
6 để chuyển đổi các phím thành các chỉ số

Thêm các phương thức const collection = new Map(); collection.set("Nathan", "555-0182"); collection["size"] = false; console.log(collection.get("size")); // undefined console.log(collection.size); // 13 và const collection = new Map(); collection.set("Nathan", "555-0182"); collection["size"] = false; console.log(collection.get("size")); // undefined console.log(collection.size); // 14 để thêm và truy xuất các cặp khóa/giá trị từ bảng.

Được rồi, hãy bắt đầu với việc tạo lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3. Mã bên dưới sẽ tạo ra một thùng
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
4 với kích thước
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
1:

class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
Hashtable Lớp thuộc tính ban đầu

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}

Tất cả các cặp khóa/giá trị của bạn sẽ được lưu trữ bên trong thuộc tính

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
4.

Cách viết phương thức băm ()

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash % this.table.length;
}

Bây giờ bạn đã hoàn thành phương thức

class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
8, đã đến lúc viết các phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4.

Cách ghi phương thức SET ()

Để đặt cặp khóa/giá trị trong bảng băm của bạn, bạn cần ghi một phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 chấp nhận & nbsp; ________ 74 làm tham số của nó:

  • Phương thức
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    3 sẽ gọi phương thức
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    8 để nhận giá trị
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7.
  • Cặp
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    8 sẽ được gán cho
    const myMap = new Map();
    
    myMap.set("Nathan", "555-0182");
    myMap.set("Jane", "315-0322");
    
    for (let [key, value] of myMap) {
      console.log(`${key} = ${value}`);
    }
    4 tại
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 được chỉ định
  • Sau đó, thuộc tính
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    6 sẽ được tăng lên bởi một
set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}

Bây giờ phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 đã hoàn tất, hãy viết phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để lấy một giá trị bằng khóa của nó.

Cách viết phương thức get ()

Để nhận được một giá trị nhất định từ bảng băm, bạn cần ghi một phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 chấp nhận giá trị
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
4 làm tham số của nó:

  • Phương thức sẽ gọi phương thức
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    8 để một lần nữa truy xuất bảng
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7
  • Trả lại giá trị được lưu trữ tại
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash % this.table.length;
    }
    8
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
0

Bằng cách này, phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 sẽ trả về cặp khóa/giá trị trở lại hoặc
set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
0 khi không có cặp khóa/giá trị được lưu trữ trong
_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}
7 được chỉ định.

Càng xa càng tốt. Hãy thêm một phương thức khác để xóa cặp khóa/giá trị khỏi bảng băm tiếp theo.

Cách ghi phương thức Remove ()

Để xóa một cặp khóa/giá trị khỏi bảng băm, bạn cần ghi một phương thức

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2 chấp nhận giá trị
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
4 làm tham số của nó:

  • Truy xuất đúng
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 bằng phương pháp
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    8
  • Kiểm tra xem
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash % this.table.length;
    }
    8 có giá trị sự thật không và thuộc tính
    set(key, value) {
      const index = this._hash(key);
      this.table[index] = [key, value];
      this.size++;
    }
    7 lớn hơn 0. Chỉ định giá trị
    set(key, value) {
      const index = this._hash(key);
      this.table[index] = [key, value];
      this.size++;
    }
    0 cho bên phải
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 và giảm thuộc tính
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    6 cho một nếu là.
  • Nếu không, chỉ cần trả lại
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    7
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
1

Với điều đó, bây giờ bạn có một phương pháp

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2 hoạt động. Hãy xem liệu lớp
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 có hoạt động đúng không.

Cách kiểm tra việc thực hiện bảng băm

Đã đến lúc kiểm tra việc thực hiện bảng băm. Đây là mã đầy đủ cho việc triển khai bảng băm một lần nữa:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
2 Triển khai Hashtable trong JavaScript

Để kiểm tra lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3, tôi sẽ tạo một thể hiện mới của
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
05 và đặt một số cặp khóa/giá trị như hình dưới đây. Các cặp khóa/giá trị dưới đây chỉ là các giá trị số tùy ý được ghép nối với tên quốc gia mà không có bất kỳ ý nghĩa đặc biệt nào:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
3Testing set set () Phương thức

Sau đó, chúng ta hãy cố gắng truy xuất chúng bằng phương pháp

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
4Testing Hashtable Get () Phương thức

Cuối cùng, chúng ta hãy cố gắng xóa một trong những giá trị này bằng phương thức

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
5 Thử nghiệm Hashtable Remove () Phương thức

Được rồi, tất cả các phương pháp đang hoạt động như mong đợi. Hãy thử một lần chèn khác với một thể hiện

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 mới và truy xuất các giá trị đó:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
6Hash Chỉ số bảng va chạm & NBSP;

Ối! Có vẻ như chúng tôi đã gặp một số rắc rối ở đây. 😨

Cách xử lý chỉ số va chạm

Đôi khi, hàm băm trong bảng băm có thể trả về cùng số

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}
7. Trong trường hợp thử nghiệm ở trên, chuỗi
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
10 và
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
11 đều trả về cùng một giá trị
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
12 vì số
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
13 là tổng của cả hai mã ASCII của chúng.both return the same
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
12 value
because the number
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
13 is the sum of both of their ASCII code.

Giá trị

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
12 tương tự sẽ khiến chỉ số va chạm, ghi đè mục nhập trước đó với mục mới.

Ngay bây giờ, dữ liệu được lưu trữ trong triển khai bảng băm của chúng tôi trông như sau:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
7

Để xử lý va chạm số

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}
7, bạn cần lưu trữ cặp khóa/giá trị trong một mảng thứ hai để kết quả cuối cùng trông như sau:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
8

Để tạo mảng thứ hai, bạn cần cập nhật phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 để nó sẽ:

  • Nhìn vào
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash % this.table.length;
    }
    8 và lặp qua các giá trị mảng.
  • Nếu khóa tại một trong các mảng bằng với
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    4 được truyền vào phương thức, hãy thay thế giá trị tại INDEX
    const obj = {};
    obj.name = "Nathan";
    
    console.log(obj.hasOwnProperty("name")); // true
    19 và dừng bất kỳ thực thi nào thêm bằng câu lệnh
    const obj = {};
    obj.name = "Nathan";
    
    console.log(obj.hasOwnProperty("name")); // true
    20.
  • Nếu không tìm thấy
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    4 phù hợp, hãy đẩy một mảng khóa và giá trị mới vào mảng thứ hai.
  • Khác, khởi tạo một mảng mới và đẩy cặp khóa/giá trị vào
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 được chỉ định
  • Bất cứ khi nào một phương thức
    const obj = {};
    obj.name = "Nathan";
    
    console.log(obj.hasOwnProperty("name")); // true
    23 được gọi, hãy tăng thuộc tính
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    6 lên một.

Mã phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 hoàn chỉnh sẽ như sau:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
9

Tiếp theo, cập nhật phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để nó cũng sẽ kiểm tra mảng cấp hai bằng vòng lặp
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
27 và trả về cặp khóa/giá trị phù hợp:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
0

Cuối cùng, bạn cần cập nhật phương thức

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2 để nó sẽ lặp qua mảng cấp hai và xóa mảng bằng giá trị
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
4 bên phải bằng phương thức
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
30:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
1

Với điều đó, lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 của bạn sẽ có thể tránh được bất kỳ va chạm số chỉ mục nào và lưu trữ cặp khóa/giá trị bên trong mảng cấp hai.

Như một phần thưởng, hãy thêm một phương thức

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
32 sẽ hiển thị tất cả các cặp khóa/giá trị được lưu trữ trong bảng băm. Bạn chỉ cần sử dụng phương thức
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
33 để lặp qua bảng và
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
34 Các giá trị cho một chuỗi như hình dưới đây:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
2

Đây là mã lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 hoàn chỉnh một lần nữa với việc tránh va chạm được áp dụng cho tài liệu tham khảo của bạn:

Triển khai lớp Hashtable ____23Complete

Bạn có thể kiểm tra việc thực hiện bằng cách tạo một thể hiện

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 mới và thực hiện một số chèn và xóa:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
4 Một bài kiểm tra hashtable

Bây giờ không có sự va chạm trong trường hợp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3. Công việc tuyệt vời!

Sự kết luận

Trong hướng dẫn này, bạn đã học được bảng băm là gì và JavaScript sử dụng nó như thế nào để tạo cấu trúc dữ liệu

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 và
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6.

Bạn cũng đã học được cách thực hiện lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 của riêng bạn cũng như cách ngăn các chỉ số chính của bảng Hash va chạm bằng cách sử dụng kỹ thuật chuỗi.

Bằng cách sử dụng cấu trúc dữ liệu bảng băm, bạn sẽ có thể tạo một mảng kết hợp với các hoạt động tìm kiếm, chèn và xóa nhanh. 😉

Cảm ơn bạn đã đọc hướng dẫn này

Nếu bạn muốn tìm hiểu thêm về JavaScript, bạn có thể muốn xem trang web của tôi tại Sebhastian.com, nơi tôi đã xuất bản hơn 100 hướng dẫn về lập trình với JavaScript, tất cả đều sử dụng các giải thích dễ hiểu và ví dụ về mã.

Các hướng dẫn bao gồm thao tác chuỗi, thao tác ngày, phương thức mảng và đối tượng, các giải pháp thuật toán JavaScript và nhiều hơn nữa.



Học mã miễn phí. Chương trình giảng dạy nguồn mở của Freecodecamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu

Hash trong javascript là gì?

Hàm băm (thuật toán băm) lấy một khóa (chuỗi) và biến nó thành một số. Sau đó, nó lặp lại số đó thành một chỉ mục trong một mảng. Các từ khác nhau được ánh xạ tới các số khác nhau bởi một hàm băm. Một hàm băm là không thể đảo ngược.takes a key (string) and transforms it into a number. It then remaps that number into an index in an array. Different words are mapped to different numbers by a hash function. A hash function is irreversible.

Chìa khóa băm là gì?

Dấu hiệu số, còn được gọi là phím số, pound hoặc băm, khóa trên bàn phím điện thoại.Để sử dụng trong cấu trúc dữ liệu, cơ sở dữ liệu và các ứng dụng mật mã, xem hàm băm hoặc khóa duy nhất.a key on a telephone keypad. For its use in data structure, database and cryptographic applications, see hash function or unique key.

Làm thế nào để một công việc khóa băm?

Băm là quá trình chuyển đổi bất kỳ khóa đã cho hoặc chuỗi ký tự thành một giá trị khác.Điều này thường được biểu thị bằng một giá trị hoặc phím có độ dài ngắn hơn, đại diện và giúp dễ dàng tìm hoặc sử dụng chuỗi gốc.Việc sử dụng phổ biến nhất để băm là việc thực hiện các bảng băm.transforming any given key or a string of characters into another value. This is usually represented by a shorter, fixed-length value or key that represents and makes it easier to find or employ the original string. The most popular use for hashing is the implementation of hash tables.

Ví dụ băm là gì?

Một ví dụ về băm băm từ ngữ Hello Hello sẽ tạo ra một đầu ra có cùng độ dài với băm cho tôi, tôi sẽ đến cửa hàng.Hàm được sử dụng để tạo băm là xác định, có nghĩa là nó sẽ tạo ra cùng một kết quả mỗi lần sử dụng đầu vào giống nhau.the word “hello” will produce an output that is the same length as the hash for “I am going to the store.” The function used to generate the hash is deterministic, meaning that it will produce the same result each time the same input is used.