Я пишу модуль C++ для node.js и столкнулся с следующей проблемой. Код:Обратный буфер от модуля C++ back to node.js
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++ - механика к узлу. Но я новичок в этой области, поэтому мне нужна ваша помощь для создания правильного модуля.