1 #define PERL_NO_GET_CONTEXT
2 #define MATH_INT64_NATIVE_IF_AVAILABLE
7 #include "perl_math_int64.h"
10 #include "highwayhash.c"
12 typedef HighwayHashCat* Digest__HighwayHash;
14 void process_key(pTHX_ AV *key_av, uint64_t *key) {
18 if(av_len(key_av) + 1 != 4)
19 croak("Key for highway_hash must be a 4-element array");
20 for(i = 0 ; i < 4 ; i++) {
21 elt = *av_fetch(key_av, i, 0);
29 uint64_t highway_hash64(AV *key_av, unsigned char *bytes, size_t size) {
32 process_key(aTHX_ key_av, key);
33 return HighwayHash64(bytes, size, key);
36 AV* highway_hash128(AV *key_av, unsigned char *bytes, size_t size) {
41 process_key(aTHX_ key_av, key);
42 HighwayHash128(bytes, size, key, hash);
44 av_push(result, sv_2mortal(newSVu64(hash[0])));
45 av_push(result, sv_2mortal(newSVu64(hash[1])));
49 AV* highway_hash256(AV *key_av, unsigned char *bytes, size_t size) {
54 process_key(aTHX_ key_av, key);
55 HighwayHash256(bytes, size, key, hash);
57 av_push(result, sv_2mortal(newSVu64(hash[0])));
58 av_push(result, sv_2mortal(newSVu64(hash[1])));
59 av_push(result, sv_2mortal(newSVu64(hash[2])));
60 av_push(result, sv_2mortal(newSVu64(hash[3])));
64 Digest__HighwayHash new(AV *key_av) {
67 Digest__HighwayHash state;
68 Newx(state, 1, HighwayHashCat);
69 process_key(aTHX_ key_av, key);
70 HighwayHashCatStart(key, state);
74 void append(Digest__HighwayHash state, unsigned char *bytes, size_t size) {
75 HighwayHashCatAppend(bytes, size, state);
78 uint64_t finish64(Digest__HighwayHash state) {
79 return HighwayHashCatFinish64(state);
82 AV* finish128(Digest__HighwayHash state) {
86 HighwayHashCatFinish128(state, hash);
88 av_push(result, sv_2mortal(newSVu64(hash[0])));
89 av_push(result, sv_2mortal(newSVu64(hash[1])));
93 AV* finish256(Digest__HighwayHash state) {
97 HighwayHashCatFinish256(state, hash);
99 av_push(result, sv_2mortal(newSVu64(hash[0])));
100 av_push(result, sv_2mortal(newSVu64(hash[1])));
101 av_push(result, sv_2mortal(newSVu64(hash[2])));
102 av_push(result, sv_2mortal(newSVu64(hash[3])));
106 MODULE = Digest::HighwayHash PACKAGE = Digest::HighwayHash
109 PERL_MATH_INT64_LOAD_OR_CROAK;
111 uint64_t highway_hash64(AV *key_av, unsigned char *bytes, size_t length(bytes))
113 AV* highway_hash128(AV *key_av, unsigned char *bytes, size_t length(bytes))
115 AV* highway_hash256(AV *key_av, unsigned char *bytes, size_t length(bytes))
117 Digest::HighwayHash new(SV *class, AV *key_av)
120 void append(Digest::HighwayHash state, unsigned char *bytes, size_t length(bytes))
122 uint64_t finish64(Digest::HighwayHash state)
124 AV* finish128(Digest::HighwayHash state)
126 AV* finish256(Digest::HighwayHash state)