我有像:
这样的对象{ "_id" : ObjectId( "4e00e83608146e71e6edba81" ),
....
"text" : "Text now exists in the database"}
我可以使用com.mongodb.util.Hash.longHash方法通过java添加哈希字段来创建
{ "_id" : ObjectId( "4e00e83608146e71e6edba81" ),
....
"text" : "Text now exists in the database",
"tHash" : -4375633875013353634 }
但这很慢。我希望能够在数据库中做一些事情,如:
db.foo.find({})。forEach(function(x){
x.tHash = someFunction(x.text); //创建一个与com.mongodb.util.Hash.longHash兼容的长哈希
db.foo.save(X);
});
有谁知道如何在Javascript函数中调用这个长哈希?
答案 0 :(得分:2)
首先定义一个好用的hashCode函数。默认情况下,JavaScript在所有对象上都没有hashCode函数,因此您需要编写一个。或者只使用这个:
var hashCode = function(s) {
if (s == null) return 0;
if (s.length == 0) return 1;
var hash = 0;
for (var i = 0; i < s.length; i++) {
hash = ((hash << 5) - hash) + s.charCodeAt(i);
hash = hash & hash; // Convert to 32bit integer
}
return hash;
};
或者使用另一个哈希函数,如MD5 - 有些脚本可以为你生成它们。
答案 1 :(得分:0)
我放弃了尝试在Javascript中复制Mongo Java驱动程序Hash.longHash方法,因为JS将所有内容都视为浮点数并且不像Java那样处理溢出。我找到了一些在JS中复制Java hashCode函数的例子,所以我这样做了:
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编号,并作为Double存储在Mongo中,占用的空间比必要的多得多。 NumberInt
是32位有符号整数,NumberLong
是64位版本。