Crypt-xxHash

 view release on metacpan or  search on metacpan

xs/xxHash.xs  view on Meta::CPAN


char*
xxhash32_hex ( const char *input, int length(input), UV seed )
    CODE:
        static char value32[9];
        static const char *format = "%08x";
#ifdef CPP
        sprintf(value32, format, (uint32_t) XXH32(input, STRLEN_length_of_input, move(seed)) );
#else
        sprintf(value32, format, (uint32_t) XXH32(input, STRLEN_length_of_input, seed) );
#endif
        RETVAL = value32;
    OUTPUT:
        RETVAL

char*
xxhash64_hex( const char *input, int length(input), UV seed )
    CODE:
        static char value64[17];
        static const char *format = "%016" PRIx64;
#ifdef CPP
        sprintf(value64, format, (uint64_t) XXH64(input, STRLEN_length_of_input, move(seed)) );
#else
        sprintf(value64, format, (uint64_t) XXH64(input, STRLEN_length_of_input, seed) );
#endif
        RETVAL = value64;
    OUTPUT:
        RETVAL

char*
xxhash3_64bits_hex( const char *input, int length(input), UV seed )
    CODE:
        static char value64[17];
        static const char *format = "%016" PRIx64;
#ifdef CPP
        sprintf(value64, format, (uint64_t) XXH3_64bits_withSeed(input, STRLEN_length_of_input, move(seed)) );
#else
        sprintf(value64, format, (uint64_t) XXH3_64bits_withSeed(input, STRLEN_length_of_input, seed) );
#endif
        RETVAL = value64;
    OUTPUT:
        RETVAL

char*
xxhash3_128bits_hex( const char *input, int length(input), UV seed )
    CODE:
        static char value64[33];
        static const char *format = "%016" PRIx64 "%016" PRIx64;
#ifdef CPP
        XXH128_hash_t hash = XXH3_128bits_withSeed(input, STRLEN_length_of_input, move(seed));
#else
        XXH128_hash_t hash = XXH3_128bits_withSeed(input, STRLEN_length_of_input, seed);
#endif
        sprintf(value64, format, (uint64_t) hash.high64, (uint64_t) hash.low64 );
        RETVAL = value64;
    OUTPUT:
        RETVAL

void
xxhash3_64bits_stream( UV seed )
    PPCODE:
        XXH64_state_t * state = XXH64_createState();
        if( !state )
            croak("Allocate 64bits xxHash state failed.");
        if( XXH64_reset(state, seed) == XXH_ERROR )
            croak("Initialize 64bits xxHash state failed.");
        SV *canceller = NEWSV(0, 0);
        SvUPGRADE(canceller, SVt_PVMG);
        sv_magicext(canceller, NULL, PERL_MAGIC_ext, &canceller_vtbl, (const char*)state, 0);
        mPUSHs(newRV_noinc(canceller));

void
xxhash3_64bits_stream_update(SV * state_RV, SV * data_SV)
    PPCODE:
        if( !SvROK(state_RV) )
            croak("This is not a 64bits xxHash state variable.");
        MAGIC * mg = mg_findext(SvRV(state_RV), PERL_MAGIC_ext, &canceller_vtbl);
        if( !mg )
            croak("This is not a 64bits xxHash state variable.");
        STRLEN len;
        char * buf = SvPV(data_SV, len);
        if( XXH64_update((XXH64_state_t*)mg->mg_ptr, buf, len) == XXH_ERROR )
            croak("Update 64bits xxHash state failed.");

void
xxhash3_64bits_stream_digest(SV * state_RV)
    PPCODE:
        dXSTARG;
        if( !SvROK(state_RV) )
            croak("This is not a 64bits xxHash state variable.");
        MAGIC * mg = mg_findext(SvRV(state_RV), PERL_MAGIC_ext, &canceller_vtbl);
        if( !mg )
            croak("This is not a 64bits xxHash state variable.");

        PUSHu((UV) XXH64_digest((XXH64_state_t*)mg->mg_ptr));

void
xxhash3_64bits_stream_digest_hex(SV * state_RV)
    PPCODE:
        if( !SvROK(state_RV) )
            croak("This is not a 64bits xxHash state variable.");
        MAGIC * mg = mg_findext(SvRV(state_RV), PERL_MAGIC_ext, &canceller_vtbl);
        if( !mg )
            croak("This is not a 64bits xxHash state variable.");

        mPUSHs(newSVpvf("%016" PRIx64, (uint64_t)XXH64_digest((XXH64_state_t*)mg->mg_ptr)));



( run in 0.921 second using v1.01-cache-2.11-cpan-71847e10f99 )