diff --git a/src/data-structures/hash-table/HashTable.js b/src/data-structures/hash-table/HashTable.js index 742c19b2..c10a0a95 100644 --- a/src/data-structures/hash-table/HashTable.js +++ b/src/data-structures/hash-table/HashTable.js @@ -70,8 +70,9 @@ export default class HashTable { hash = (hash << 8) | hashPerRound; } - // Unsigned right shift to avoid negative number. - hash >>>= 1; + // Bit mask to clear the left most bit, + // so the result will be a positive number. + hash &= 0x7FFFFFFF; // Reduce hash number so it would fit hash table size. return hash % this.buckets.length; diff --git a/src/data-structures/hash-table/__test__/HashTable.test.js b/src/data-structures/hash-table/__test__/HashTable.test.js index 0b6ec9c3..054ad09f 100644 --- a/src/data-structures/hash-table/__test__/HashTable.test.js +++ b/src/data-structures/hash-table/__test__/HashTable.test.js @@ -12,18 +12,18 @@ describe('HashTable', () => { it('should generate proper hash for specified keys', () => { const hashTable = new HashTable(); - expect(hashTable.hash('a')).toBe(9); - expect(hashTable.hash('b')).toBe(26); - expect(hashTable.hash('abc')).toBe(26); + expect(hashTable.hash('a')).toBe(18); + expect(hashTable.hash('b')).toBe(21); + expect(hashTable.hash('abc')).toBe(21); }); it('should set, read and delete data with collisions', () => { const hashTable = new HashTable(3); - expect(hashTable.hash('a')).toBe(2); + expect(hashTable.hash('a')).toBe(1); expect(hashTable.hash('b')).toBe(2); - expect(hashTable.hash('c')).toBe(1); - expect(hashTable.hash('d')).toBe(2); + expect(hashTable.hash('c')).toBe(2); + expect(hashTable.hash('d')).toBe(1); hashTable.set('a', 'sky-old'); hashTable.set('a', 'sky'); @@ -38,8 +38,8 @@ describe('HashTable', () => { const stringifier = (value) => `${value.key}:${value.value}`; expect(hashTable.buckets[0].toString(stringifier)).toBe(''); - expect(hashTable.buckets[1].toString(stringifier)).toBe('c:earth'); - expect(hashTable.buckets[2].toString(stringifier)).toBe('a:sky,b:sea,d:ocean'); + expect(hashTable.buckets[1].toString(stringifier)).toBe('a:sky,d:ocean'); + expect(hashTable.buckets[2].toString(stringifier)).toBe('b:sea,c:earth'); expect(hashTable.get('a')).toBe('sky'); expect(hashTable.get('d')).toBe('ocean'); @@ -94,7 +94,7 @@ describe('HashTable', () => { hashTable.set('b', 'beta'); hashTable.set('c', 'gamma'); - expect(hashTable.getValues()).toEqual(['gamma', 'alpha', 'beta']); + expect(hashTable.getValues()).toEqual(['alpha', 'beta', 'gamma']); }); it('should get all the values from empty hash table', () => { @@ -111,6 +111,6 @@ describe('HashTable', () => { hashTable.set('ac', 'three'); - expect(hashTable.getValues()).toEqual(['one', 'three', 'two']); + expect(hashTable.getValues()).toEqual(['three', 'one', 'two']); }); });