]>
Commit | Line | Data |
---|---|---|
096619f2 MG |
1 | #define PERL_NO_GET_CONTEXT |
2 | #define MATH_INT64_NATIVE_IF_AVAILABLE | |
3 | #include "EXTERN.h" | |
4 | #include "perl.h" | |
5 | #include "XSUB.h" | |
6 | ||
7 | #include "perl_math_int64.h" | |
8 | #include "ppport.h" | |
9 | ||
10 | #include "highwayhash.c" | |
11 | ||
096619f2 MG |
12 | void process_key(pTHX_ AV *key_av, uint64_t *key) { |
13 | int i; | |
14 | SV *elt; | |
15 | ||
16 | if(av_len(key_av) + 1 != 4) | |
17 | croak("Key for highway_hash must be a 4-element array"); | |
18 | for(i = 0 ; i < 4 ; i++) { | |
19 | elt = *av_fetch(key_av, i, false); | |
20 | if(SvU64OK(elt)) | |
21 | key[i] = SvU64(elt); | |
22 | else | |
23 | key[i] = SvUV(elt); | |
24 | } | |
25 | } | |
26 | ||
373437ea | 27 | uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t size) { |
096619f2 MG |
28 | dTHX; |
29 | uint64_t key[4]; | |
30 | process_key(aTHX_ key_av, key); | |
31 | return HighwayHash64(bytes, size, key); | |
32 | } | |
33 | ||
373437ea | 34 | AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t size) { |
096619f2 MG |
35 | dTHX; |
36 | AV* result; | |
37 | uint64_t key[4]; | |
38 | uint64_t hash[2]; | |
39 | process_key(aTHX_ key_av, key); | |
40 | HighwayHash128(bytes, size, key, hash); | |
41 | result = newAV(); | |
42 | av_push(result, sv_2mortal(newSVu64(hash[0]))); | |
43 | av_push(result, sv_2mortal(newSVu64(hash[1]))); | |
44 | return result; | |
45 | } | |
46 | ||
373437ea | 47 | AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t size) { |
096619f2 MG |
48 | dTHX; |
49 | AV* result; | |
50 | uint64_t key[4]; | |
beb05fe5 | 51 | uint64_t hash[4]; |
096619f2 MG |
52 | process_key(aTHX_ key_av, key); |
53 | HighwayHash256(bytes, size, key, hash); | |
54 | result = newAV(); | |
55 | av_push(result, sv_2mortal(newSVu64(hash[0]))); | |
56 | av_push(result, sv_2mortal(newSVu64(hash[1]))); | |
57 | av_push(result, sv_2mortal(newSVu64(hash[2]))); | |
58 | av_push(result, sv_2mortal(newSVu64(hash[3]))); | |
59 | return result; | |
60 | } | |
61 | ||
62 | MODULE = Digest::HighwayHash PACKAGE = Digest::HighwayHash | |
373437ea | 63 | PROTOTYPES: DISABLE |
096619f2 MG |
64 | BOOT: |
65 | PERL_MATH_INT64_LOAD_OR_CROAK; | |
66 | ||
373437ea | 67 | uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t length(bytes)) |
096619f2 | 68 | |
373437ea | 69 | AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t length(bytes)) |
096619f2 | 70 | |
373437ea | 71 | AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t length(bytes)) |