HashTable.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. var Class = require('./Class');
  2. var LinkedList = require('./LinkedList');
  3. var map = require('./map');
  4. var strHash = require('./strHash');
  5. var has = require('./has');
  6. exports = Class({
  7. initialize: function HashTable() {
  8. var size =
  9. arguments.length > 0 && arguments[0] !== undefined
  10. ? arguments[0]
  11. : 32;
  12. this._buckets = map(Array(size), function() {
  13. return new LinkedList();
  14. });
  15. this._keys = {};
  16. },
  17. set: function(key, val) {
  18. var keyHash = this._hash(key);
  19. this._keys[key] = keyHash;
  20. var linkedList = this._buckets[keyHash];
  21. var node = linkedList.find(function(val) {
  22. return val.key === key;
  23. });
  24. if (!node) {
  25. linkedList.push({
  26. key: key,
  27. value: val
  28. });
  29. } else {
  30. node.value.value = val;
  31. }
  32. },
  33. get: function(key) {
  34. var linkedList = this._buckets[this._hash(key)];
  35. var node = linkedList.find(function(val) {
  36. return val.key === key;
  37. });
  38. if (node) {
  39. return node.value.value;
  40. }
  41. },
  42. has: function(key) {
  43. return has(this._keys, key);
  44. },
  45. delete: function(key) {
  46. var keyHash = this._hash(key);
  47. delete this._keys[key];
  48. var linkedList = this._buckets[keyHash];
  49. var node = linkedList.find(function(val) {
  50. return val.key === key;
  51. });
  52. if (node) {
  53. linkedList.rmNode(node);
  54. }
  55. },
  56. _hash: function(key) {
  57. return strHash(key) % this._buckets.length;
  58. }
  59. });
  60. module.exports = exports;