Browse Source

改版

master
SisMaker 5 years ago
parent
commit
1c0671e055
4 changed files with 82 additions and 82 deletions
  1. +24
    -44
      c_src/nifHashb/nifHashb.c
  2. +44
    -24
      c_src/nifHashb/nifHashb.cback
  3. +0
    -13
      src/nifSrc/nifHashb/nifHashb.erl
  4. +14
    -1
      src/nifSrc/nifHashb/nifHashbback.erl

+ 24
- 44
c_src/nifHashb/nifHashb.c View File

@ -327,41 +327,35 @@ static ERL_NIF_TERM get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
}
//enif_fprintf(stdout, "IMY************get1111\n");
uint32_t BblIndex_1, BblIndex_2;
if(!enif_get_uint(env, argv[1], &BblIndex_1)) {
ErlNifBinary getKey;
if (!enif_term_to_binary(env, argv[1], &getKey))
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************get22221111\n");
if(!enif_get_uint(env, argv[2], &BblIndex_2)) {
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************get2222\n");
BblIndex_1 = BblIndex_1 % ResPtr->bblSize_1;
BblIndex_2 = BblIndex_2 % ResPtr->bblSize_2;
uint32_t BblIndex_1, BblIndex_2;
BblIndex_1 = murmurhash(getKey.data, getKey.size, 131) % ResPtr->bblSize_1;
BblIndex_2 = murmurhash(getKey.data, getKey.size, 16777619) % ResPtr->bblSize_2;
//enif_fprintf(stdout, "IMY************get3333\n");
if (NULL == ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head) {
//enif_fprintf(stdout, "IMY************get4444\n");
enif_release_binary(&getKey);
return undefined;
} else {
//enif_fprintf(stdout, "IMY************get55555\n");
ErlNifBinary getKey;
if (!enif_inspect_binary(env, argv[3], &getKey))
return enif_make_badarg(env);
// enif_fprintf(stdout, "IMY************get55555\n");
node *Head = ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head;
while (Head) {
//enif_fprintf(stdout, "IMY************get7777\n");
// enif_fprintf(stdout, "IMY************get7777\n");
if (compareBin(getKey, Head->Key) == 0) {
ERL_NIF_TERM Ret;
enif_binary_to_term(env, Head->Value.data, Head->Value.size, &Ret, 0);
//enif_fprintf(stdout, "IMY************get5555\n");
enif_release_binary(&getKey);
return Ret;
}
Head = Head->next;
}
//enif_fprintf(stdout, "IMY************get6666\n");
enif_release_binary(&getKey);
return undefined;
}
}
@ -374,33 +368,23 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
}
//enif_fprintf(stdout, "IMY************put111 \n");
uint32_t BblIndex_1, BblIndex_2;
if(!enif_get_uint(env, argv[1], &BblIndex_1)) {
return enif_make_badarg(env);
}
if(!enif_get_uint(env, argv[2], &BblIndex_2)) {
return enif_make_badarg(env);
}
BblIndex_1 = BblIndex_1 % ResPtr->bblSize_1;
BblIndex_2 = BblIndex_2 % ResPtr->bblSize_2;
ErlNifBinary Key, Value;
if (!enif_inspect_binary(env, argv[3], &Key))
if (!enif_term_to_binary(env, argv[1], &Key))
return enif_make_badarg(env);
if (!enif_inspect_binary(env, argv[4], &Value))
if (!enif_term_to_binary(env, argv[2], &Value))
return enif_make_badarg(env);
uint32_t BblIndex_1, BblIndex_2;
BblIndex_1 = murmurhash(Key.data, Key.size, 131) % ResPtr->bblSize_1;
BblIndex_2 = murmurhash(Key.data, Key.size, 16777619) % ResPtr->bblSize_2;
//enif_fprintf(stdout, "IMY************put222 %d %d \n", BblIndex_1, BblIndex_2);
//enif_fprintf(stdout, "IMY************put3333 \n");
if (NULL == ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head) {
node *NewNode = enif_alloc(sizeof(node));
enif_alloc_binary(Key.size, &NewNode->Key);
enif_alloc_binary(Value.size, &NewNode->Value);
memcpy(NewNode->Key.data, Key.data, Key.size);
memcpy(NewNode->Value.data, Value.data, Value.size);
NewNode->Key = Key;
NewNode->Value = Value;
NewNode->next = NULL;
ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head = NewNode;
ResPtr->keySize = ResPtr->keySize + 1;
@ -412,12 +396,10 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
if (compareBin(Key, Head->Key) == 0) {
//ERL_NIF_TERM Ret;
ErlNifBinary OldValue = Head->Value;
enif_release_binary(&OldValue);
//enif_binary_to_term(env, OldValue.data, OldValue.size, &Ret, 0);
ErlNifBinary NewValue;
enif_alloc_binary(Value.size, &NewValue);
memcpy(NewValue.data, Value.data, Value.size);
Head->Value = NewValue;
Head->Value = Value;
enif_release_binary(&OldValue);
enif_release_binary(&Key);
//enif_fprintf(stdout, "IMY************put55555 \n");
//return Ret;
return ok;
@ -425,10 +407,8 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
Head = Head->next;
}
node *NewNode = enif_alloc(sizeof(node));
enif_alloc_binary(Key.size, &NewNode->Key);
enif_alloc_binary(Value.size, &NewNode->Value);
memcpy(NewNode->Key.data, Key.data, Key.size);
memcpy(NewNode->Value.data, Value.data, Value.size);
NewNode->Key = Key;
NewNode->Value = Value;
NewNode->next = ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head;
ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head = NewNode;
ResPtr->keySize = ResPtr->keySize + 1;
@ -440,8 +420,8 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
static ErlNifFunc nifFuns[] = {
{"new", 0, new},
{"get", 4, get},
{"put", 5, put},
{"get", 2, get},
{"put", 3, put},
{"hash1", 2, hash1},
{"hash2", 2, hash2},
{"hash3", 2, hash3},

c_src/nifHashb/nifHashb.cbak → c_src/nifHashb/nifHashb.cback View File

@ -327,35 +327,41 @@ static ERL_NIF_TERM get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
}
//enif_fprintf(stdout, "IMY************get1111\n");
ErlNifBinary getKey;
if (!enif_term_to_binary(env, argv[1], &getKey))
uint32_t BblIndex_1, BblIndex_2;
if(!enif_get_uint(env, argv[1], &BblIndex_1)) {
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************get22221111\n");
if(!enif_get_uint(env, argv[2], &BblIndex_2)) {
return enif_make_badarg(env);
}
//enif_fprintf(stdout, "IMY************get2222\n");
uint32_t BblIndex_1, BblIndex_2;
BblIndex_1 = murmurhash(getKey.data, getKey.size, 131) % ResPtr->bblSize_1;
BblIndex_2 = murmurhash(getKey.data, getKey.size, 16777619) % ResPtr->bblSize_2;
BblIndex_1 = BblIndex_1 % ResPtr->bblSize_1;
BblIndex_2 = BblIndex_2 % ResPtr->bblSize_2;
//enif_fprintf(stdout, "IMY************get3333\n");
if (NULL == ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head) {
//enif_fprintf(stdout, "IMY************get4444\n");
enif_release_binary(&getKey);
return undefined;
} else {
// enif_fprintf(stdout, "IMY************get55555\n");
//enif_fprintf(stdout, "IMY************get55555\n");
ErlNifBinary getKey;
if (!enif_inspect_binary(env, argv[3], &getKey))
return enif_make_badarg(env);
node *Head = ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head;
while (Head) {
// enif_fprintf(stdout, "IMY************get7777\n");
//enif_fprintf(stdout, "IMY************get7777\n");
if (compareBin(getKey, Head->Key) == 0) {
ERL_NIF_TERM Ret;
enif_binary_to_term(env, Head->Value.data, Head->Value.size, &Ret, 0);
//enif_fprintf(stdout, "IMY************get5555\n");
enif_release_binary(&getKey);
return Ret;
}
Head = Head->next;
}
//enif_fprintf(stdout, "IMY************get6666\n");
enif_release_binary(&getKey);
return undefined;
}
}
@ -368,23 +374,33 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
}
//enif_fprintf(stdout, "IMY************put111 \n");
uint32_t BblIndex_1, BblIndex_2;
if(!enif_get_uint(env, argv[1], &BblIndex_1)) {
return enif_make_badarg(env);
}
if(!enif_get_uint(env, argv[2], &BblIndex_2)) {
return enif_make_badarg(env);
}
BblIndex_1 = BblIndex_1 % ResPtr->bblSize_1;
BblIndex_2 = BblIndex_2 % ResPtr->bblSize_2;
ErlNifBinary Key, Value;
if (!enif_term_to_binary(env, argv[1], &Key))
if (!enif_inspect_binary(env, argv[3], &Key))
return enif_make_badarg(env);
if (!enif_term_to_binary(env, argv[2], &Value))
if (!enif_inspect_binary(env, argv[4], &Value))
return enif_make_badarg(env);
uint32_t BblIndex_1, BblIndex_2;
BblIndex_1 = murmurhash(Key.data, Key.size, 131) % ResPtr->bblSize_1;
BblIndex_2 = murmurhash(Key.data, Key.size, 16777619) % ResPtr->bblSize_2;
//enif_fprintf(stdout, "IMY************put222 %d %d \n", BblIndex_1, BblIndex_2);
//enif_fprintf(stdout, "IMY************put3333 \n");
if (NULL == ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head) {
node *NewNode = enif_alloc(sizeof(node));
NewNode->Key = Key;
NewNode->Value = Value;
enif_alloc_binary(Key.size, &NewNode->Key);
enif_alloc_binary(Value.size, &NewNode->Value);
memcpy(NewNode->Key.data, Key.data, Key.size);
memcpy(NewNode->Value.data, Value.data, Value.size);
NewNode->next = NULL;
ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head = NewNode;
ResPtr->keySize = ResPtr->keySize + 1;
@ -396,10 +412,12 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
if (compareBin(Key, Head->Key) == 0) {
//ERL_NIF_TERM Ret;
ErlNifBinary OldValue = Head->Value;
//enif_binary_to_term(env, OldValue.data, OldValue.size, &Ret, 0);
Head->Value = Value;
enif_release_binary(&OldValue);
enif_release_binary(&Key);
//enif_binary_to_term(env, OldValue.data, OldValue.size, &Ret, 0);
ErlNifBinary NewValue;
enif_alloc_binary(Value.size, &NewValue);
memcpy(NewValue.data, Value.data, Value.size);
Head->Value = NewValue;
//enif_fprintf(stdout, "IMY************put55555 \n");
//return Ret;
return ok;
@ -407,8 +425,10 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
Head = Head->next;
}
node *NewNode = enif_alloc(sizeof(node));
NewNode->Key = Key;
NewNode->Value = Value;
enif_alloc_binary(Key.size, &NewNode->Key);
enif_alloc_binary(Value.size, &NewNode->Value);
memcpy(NewNode->Key.data, Key.data, Key.size);
memcpy(NewNode->Value.data, Value.data, Value.size);
NewNode->next = ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head;
ResPtr->arrayPtr[BblIndex_1][BblIndex_2].head = NewNode;
ResPtr->keySize = ResPtr->keySize + 1;
@ -420,8 +440,8 @@ static ERL_NIF_TERM put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
static ErlNifFunc nifFuns[] = {
{"new", 0, new},
{"get", 2, get},
{"put", 3, put},
{"get", 4, get},
{"put", 5, put},
{"hash1", 2, hash1},
{"hash2", 2, hash2},
{"hash3", 2, hash3},

+ 0
- 13
src/nifSrc/nifHashb/nifHashb.erl View File

@ -34,22 +34,9 @@ new() ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
get(Ref, Key) ->
KeyBin = erlang:term_to_binary(Key),
Hash1 = erlang:phash2(KeyBin),
Hash2 = erlang:phash2(KeyBin, 123211111),
get(Ref, Hash1, Hash2, KeyBin).
get(Ref, Hash1, Hash2, KeyBin) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
put(Ref, Key, Value) ->
KeyBin = erlang:term_to_binary(Key),
ValueBin = erlang:term_to_binary(Value),
Hash1 = erlang:phash2(KeyBin),
Hash2 = erlang:phash2(KeyBin, 123211111),
put(Ref, Hash1, Hash2, KeyBin, ValueBin).
put(Ref, Hash1, Hash2, Key, Value) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
hash1(Term, Range) ->

src/nifSrc/nifHashb/nifHashbbak.erl → src/nifSrc/nifHashb/nifHashbback.erl View File

@ -1,4 +1,4 @@
-module(nifHashbbak).
-module(nifHashbback).
-on_load(init/0).
@ -34,9 +34,22 @@ new() ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
get(Ref, Key) ->
KeyBin = erlang:term_to_binary(Key),
Hash1 = erlang:phash2(KeyBin),
Hash2 = erlang:phash2(KeyBin, 123211111),
get(Ref, Hash1, Hash2, KeyBin).
get(Ref, Hash1, Hash2, KeyBin) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
put(Ref, Key, Value) ->
KeyBin = erlang:term_to_binary(Key),
ValueBin = erlang:term_to_binary(Value),
Hash1 = erlang:phash2(KeyBin),
Hash2 = erlang:phash2(KeyBin, 123211111),
put(Ref, Hash1, Hash2, KeyBin, ValueBin).
put(Ref, Hash1, Hash2, Key, Value) ->
erlang:nif_error({nif_not_loaded, module, ?MODULE, line, ?LINE}).
hash1(Term, Range) ->

Loading…
Cancel
Save