0

MongoDBシェルで、と入力するsomeDoc._idと、Mongoは。のような応答を返しますObjectId(4f6b83af44c75956279e7777)その文字列はObjectIdバイトからどのように生成されますか?

他のドライバーのソースへのリンクと同様に、このためのjavascriptソースへのリンクは大歓迎です。

4

1 に答える 1

2

それはから来ているように見えBSONElement::toStringます:

case jstOID:
    s << "ObjectId('";
    s << __oid() << "')";
    break;

そして__oid()、あなたにaを与えmongo::OID<<オペレーターは以下を呼び出します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[] = "0123456789abcdef";

    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ブランチを使用していますが、(現在の)マスターは同じです(またはほぼ同じです)。

于 2012-04-07T00:42:31.793 に答える