Я прекратил попытки тиражировать метод Mongo Java-драйвера Hash.longHash в Javascript, поскольку JS обрабатывает все как плавающее и не обрабатывает переполнение, как в Java. Я нашел несколько примеров репликации функции hashCode Java в JS, и поэтому я сделал это:
longHash = function(s){
var hash = 0;
if (s.length == 0) return hash;
for (i = 0; i < s.length; i++) {
char = s.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return NumberInt(hash);
};
db.foo.find( {} ).forEach( function (x) {
x.cHash = longHash(x.c);
db.foo.save(x);
});
, который, по крайней мере, позволил мне сделать хеш-код целого уровня для существующих данных. Этого будет достаточно, чтобы сузить данные для индексации.
Обновление : Я только что обновил, вернув вместо этого тип NumberInt
. По умолчанию хэш был числом Javascript и хранился в Mongo как Double, занимая гораздо больше места, чем необходимо. NumberInt
- это 32-разрядное целое число со знаком, а NumberLong
- это 64-разрядная версия.