2

node.js の C++ モジュールを作成していて、次の問題が発生しました。コード:

void wrapMurmurHash64B(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();
  std::string s = getDataFromArgs(args);
  if (!s.size()) {
    return;
  }

  uint32_t seed = args[1]->NumberValue();
  uint64_t hash = MurmurHash64B(s.data(), s.size(), seed);

/*
  Local<Number> num = Number::New(isolate, hash);
  args.GetReturnValue().Set(num);
  return;
*/

  // as Buffer 
  Local<Object> buf;
  if (node::Buffer::New(isolate, (char*)&hash, sizeof(uint64_t)).ToLocal(&buf)) {
    args.GetReturnValue().Set(buf);
  } else {
    isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Cannot create buffer")));
  }
}

void init(Local<Object> exports) {
  // ...
  NODE_SET_METHOD(exports, "murmurHash64B", wrapMurmurHash64B);
}

コメント化されたコードのコメントを外すと、関数はすべての呼び出しに対して同じ結果を返します

$ node
> var m = require("./build/Release/murmurhash")
> m.murmurHash64B("ws2yy")
11130111584464441000
> m.murmurHash64B("ws2yy")
11130111584464441000
> m.murmurHash64B("ws2yy")
11130111584464441000

結果は完璧ですが、ノードの最大整数サイズが原因で正しくないため、バッファを使用する必要があります。しかし、そこには別の問題があります。最初の呼び出しは、正しくない異なるバッファーを返します。しかし、それらは同じでなければなりません

$ node
> var m = require("./build/Release/murmurhash")
> m.murmurHash64B("ws2yy")
<Buffer 00 00 00 00 01 00 00 00>
> m.murmurHash64B("ws2yy")
<Buffer bc fc a8 00 00 00 00 00>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 00 00 00 00 00 00 00 00>
> m.murmurHash64B("ws2yy")
<Buffer 00 00 00 00 00 00 00 00>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>
> m.murmurHash64B("ws2yy")
<Buffer 99 90 76 26 84 19 76 9a>

エラーは、C++ からノードへのメカニズムの理解にあると思います。しかし、私はこの範囲の初心者なので、正しいモジュールを作成するためにあなたの助けが必要です.

4

1 に答える 1

0

答えを見つけた

Buffer コンストラクターの (char*)&hash は自動変数への参照であるため、その値は C++ 関数の外で udefined です。

于 2016-03-03T11:18:30.467 に答える