在MongoDB shell中,如果我輸入someDoc._id
,Mongo會回覆類似ObjectId(4f6b83af44c75956279e7777)
的內容。這個字符串是如何從ObjectId bytes生成的?如何生成一個MongoDB ObjectID的字符串表示? (在shell中)
歡迎訪問javascript源代碼的鏈接,以及其他驅動程序源代碼的鏈接。
在MongoDB shell中,如果我輸入someDoc._id
,Mongo會回覆類似ObjectId(4f6b83af44c75956279e7777)
的內容。這個字符串是如何從ObjectId bytes生成的?如何生成一個MongoDB ObjectID的字符串表示? (在shell中)
歡迎訪問javascript源代碼的鏈接,以及其他驅動程序源代碼的鏈接。
看起來是來自BSONElement::toString
:
case jstOID:
s << "ObjectId('";
s << __oid() << "')";
break;
而且__oid()
給你一個mongo::OID
和<<
operator電話str
:
inline StringBuilder& operator<< (StringBuilder& s, const OID& o) { return (s << o.str()); }
而且只是呼籲原始字節toHexLower
:
string str() const { return toHexLower(data, 12); }
最後,toHexLower
做到這一點:
inline string toHexLower(const void* inRaw, int len) {
static const char hexchars[] = "abcdef";
StringBuilder out;
const char* in = reinterpret_cast<const char*>(inRaw);
for (int i=0; i<len; ++i) {
char c = in[i];
char hi = hexchars[(c & 0xF0) >> 4];
char lo = hexchars[(c & 0x0F)];
out << hi << lo;
}
return out.str();
}
的字串是不是在JavaScript中完成的,它是用C++完成。
上面使用的是MongoDB的2.0分支,但(當前)主控是相同的(或幾乎是這樣)。
感謝您瀏覽您的回覆中的代碼。很有幫助! – ericsoco 2012-04-07 00:51:19
哦,一個快速的澄清請求,因爲操作員是非常難以谷歌,我不是一個C + +人 - 你能解釋(或鏈接到解釋)''<<' and '>>'運營商?我認爲這是一個變幻莫測的事情,但並不確定。並且,我認爲'&'是一個AND位掩碼? – ericsoco 2012-04-07 00:53:05
@ericsoco:'''運算符通常用於在C++中追加或寫入某個緩衝區,所以'out << hi << lo'將'hi'和'lo'附加到'out'。如果您需要搜索,總會有[symbolhound.com](http://symbolhound.com/)。 – 2012-04-07 00:55:06
這是參考對象addr?它習慣上是一個生成哈希的黑盒函數,爲什麼你需要它? – 2012-04-07 00:17:25