12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- var Class = require('./Class');
- var LinkedList = require('./LinkedList');
- var map = require('./map');
- var strHash = require('./strHash');
- var has = require('./has');
- exports = Class({
- initialize: function HashTable() {
- var size =
- arguments.length > 0 && arguments[0] !== undefined
- ? arguments[0]
- : 32;
- this._buckets = map(Array(size), function() {
- return new LinkedList();
- });
- this._keys = {};
- },
- set: function(key, val) {
- var keyHash = this._hash(key);
- this._keys[key] = keyHash;
- var linkedList = this._buckets[keyHash];
- var node = linkedList.find(function(val) {
- return val.key === key;
- });
- if (!node) {
- linkedList.push({
- key: key,
- value: val
- });
- } else {
- node.value.value = val;
- }
- },
- get: function(key) {
- var linkedList = this._buckets[this._hash(key)];
- var node = linkedList.find(function(val) {
- return val.key === key;
- });
- if (node) {
- return node.value.value;
- }
- },
- has: function(key) {
- return has(this._keys, key);
- },
- delete: function(key) {
- var keyHash = this._hash(key);
- delete this._keys[key];
- var linkedList = this._buckets[keyHash];
- var node = linkedList.find(function(val) {
- return val.key === key;
- });
- if (node) {
- linkedList.rmNode(node);
- }
- },
- _hash: function(key) {
- return strHash(key) % this._buckets.length;
- }
- });
- module.exports = exports;
|