I have some boilerplate code similar to rrowland's, but I feel like my algorithm could be a little bit faster. It operates in O(n) by using prime number multiplication to count letters, and is non-branching in the longest-time routine.
Instead of doing ind - 97
I keep 97 empty spots in the array that is accessed.
I think if you were more obsessive you could do the counting using bitwise operations, but this is good enough.
function isAnagram(word1, word2) {
if (!word1 || !word2 || !word1.length || !word2.length) {
throw new Error('isAnagram requires two strings to be passed.')
}
var nword1 = word1.replace(/\s+/g, '').toLowerCase();
var nword2 = word2.replace(/\s+/g, '').toLowerCase();
var length1 = nword1.length;
var length2 = nword2.length;
if (length1 !== length2) {
return false;
}
var word1hash = 1;
var word2hash = 1;
var primes = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101];
var ind;
for (var i = 0; i < length1; i++) {
ind = nword1.charCodeAt(i);
word1hash *= primes[ind];
}
for (var i = 0; i < length2; i++) {
ind = nword2.charCodeAt(i);
word2hash *= primes[ind];
}
console.log(word1hash);
console.log(word2hash);
return word1hash == word2hash;
}