X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=HighwayHash.xs;h=e04c57c0911cd359ac51da4d8264f9d3fee07a20;hb=HEAD;hp=d1cca3271507251079edaee9b1ee19eb47337cbd;hpb=373437eab532a194c035e161d6c9294c577380cb;p=digest-highwayhash.git diff --git a/HighwayHash.xs b/HighwayHash.xs index d1cca32..e04c57c 100644 --- a/HighwayHash.xs +++ b/HighwayHash.xs @@ -9,6 +9,8 @@ #include "highwayhash.c" +typedef HighwayHashCat* Digest__HighwayHash; + void process_key(pTHX_ AV *key_av, uint64_t *key) { int i; SV *elt; @@ -16,7 +18,7 @@ void process_key(pTHX_ AV *key_av, uint64_t *key) { if(av_len(key_av) + 1 != 4) croak("Key for highway_hash must be a 4-element array"); for(i = 0 ; i < 4 ; i++) { - elt = *av_fetch(key_av, i, false); + elt = *av_fetch(key_av, i, 0); if(SvU64OK(elt)) key[i] = SvU64(elt); else @@ -24,14 +26,14 @@ void process_key(pTHX_ AV *key_av, uint64_t *key) { } } -uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t size) { +uint64_t highway_hash64(AV *key_av, unsigned char *bytes, size_t size) { dTHX; uint64_t key[4]; process_key(aTHX_ key_av, key); return HighwayHash64(bytes, size, key); } -AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t size) { +AV* highway_hash128(AV *key_av, unsigned char *bytes, size_t size) { dTHX; AV* result; uint64_t key[4]; @@ -44,7 +46,7 @@ AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t size) { return result; } -AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t size) { +AV* highway_hash256(AV *key_av, unsigned char *bytes, size_t size) { dTHX; AV* result; uint64_t key[4]; @@ -59,13 +61,66 @@ AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t size) { return result; } +Digest__HighwayHash new(AV *key_av) { + dTHX; + uint64_t key[4]; + Digest__HighwayHash state; + Newx(state, 1, HighwayHashCat); + process_key(aTHX_ key_av, key); + HighwayHashCatStart(key, state); + return state; +} + +void append(Digest__HighwayHash state, unsigned char *bytes, size_t size) { + HighwayHashCatAppend(bytes, size, state); +} + +uint64_t finish64(Digest__HighwayHash state) { + return HighwayHashCatFinish64(state); +} + +AV* finish128(Digest__HighwayHash state) { + dTHX; + AV* result; + uint64_t hash[2]; + HighwayHashCatFinish128(state, hash); + result = newAV(); + av_push(result, sv_2mortal(newSVu64(hash[0]))); + av_push(result, sv_2mortal(newSVu64(hash[1]))); + return result; +} + +AV* finish256(Digest__HighwayHash state) { + dTHX; + AV* result; + uint64_t hash[4]; + HighwayHashCatFinish256(state, hash); + result = newAV(); + av_push(result, sv_2mortal(newSVu64(hash[0]))); + av_push(result, sv_2mortal(newSVu64(hash[1]))); + av_push(result, sv_2mortal(newSVu64(hash[2]))); + av_push(result, sv_2mortal(newSVu64(hash[3]))); + return result; +} + MODULE = Digest::HighwayHash PACKAGE = Digest::HighwayHash PROTOTYPES: DISABLE BOOT: PERL_MATH_INT64_LOAD_OR_CROAK; -uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t length(bytes)) +uint64_t highway_hash64(AV *key_av, unsigned char *bytes, size_t length(bytes)) + +AV* highway_hash128(AV *key_av, unsigned char *bytes, size_t length(bytes)) + +AV* highway_hash256(AV *key_av, unsigned char *bytes, size_t length(bytes)) + +Digest::HighwayHash new(SV *class, AV *key_av) +C_ARGS: key_av + +void append(Digest::HighwayHash state, unsigned char *bytes, size_t length(bytes)) + +uint64_t finish64(Digest::HighwayHash state) -AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t length(bytes)) +AV* finish128(Digest::HighwayHash state) -AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t length(bytes)) +AV* finish256(Digest::HighwayHash state)