public static ulong XXH64_digest(XXH64_state_t state_in) { //XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; //if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) return(XXH64_digest_endian(state_in /*, XXH_littleEndian*/)); //else // return XXH64_digest_endian(state_in, XXH_bigEndian); }
public static XXH_errorcode XXH64_update(XXH64_state_t state_in, void *input, size_t len) { //XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; //if ((endian_detected == XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) return(XXH64_update_endian(state_in, input, len /*, XXH_littleEndian*/)); //else // return XXH64_update_endian(state_in, input, len, XXH_bigEndian); }
public static U64 XXH64_digest_endian(XXH64_state_t state /*, XXH_endianess endian*/) { BYTE *p = (BYTE *)state.mem64; BYTE *bEnd = p + state.memsize; U64 h64; if (state.total_len >= 32) { U64 v1 = state.v1; U64 v2 = state.v2; U64 v3 = state.v3; U64 v4 = state.v4; h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); h64 = XXH64_mergeRound(h64, v1); h64 = XXH64_mergeRound(h64, v2); h64 = XXH64_mergeRound(h64, v3); h64 = XXH64_mergeRound(h64, v4); } else { h64 = state.v3 + PRIME64_5; } h64 += (U64)state.total_len; while (p + 8 <= bEnd) { U64 k1 = XXH64_round(0, XXH_readLE64(p /*, endian*/)); h64 ^= k1; h64 = XXH_rotl64(h64, 27) * PRIME64_1 + PRIME64_4; p += 8; } if (p + 4 <= bEnd) { h64 ^= (U64)(XXH_readLE32(p /*, endian*/)) * PRIME64_1; h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; p += 4; } while (p < bEnd) { h64 ^= (*p) * PRIME64_5; h64 = XXH_rotl64(h64, 11) * PRIME64_1; p++; } h64 ^= h64 >> 33; h64 *= PRIME64_2; h64 ^= h64 >> 29; h64 *= PRIME64_3; h64 ^= h64 >> 32; return(h64); }
//FORCE_INLINE_TEMPLATE U64 XXH64_endian_align( void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align) //{ // BYTE* p = ( BYTE*)input; // BYTE* bEnd = p + len; // U64 h64; //#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) //#ifdef XXH_ACCEPT_NULL_INPUT_POINTER // if (p==NULL) { // len=0; // bEnd=p=( BYTE*)(size_t)32; // } //#endif // if (len>=32) { // BYTE* limit = bEnd - 32; // U64 v1 = seed + PRIME64_1 + PRIME64_2; // U64 v2 = seed + PRIME64_2; // U64 v3 = seed + 0; // U64 v4 = seed - PRIME64_1; // do { // v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8; // v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8; // v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8; // v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8; // } while (p<=limit); // h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); // h64 = XXH64_mergeRound(h64, v1); // h64 = XXH64_mergeRound(h64, v2); // h64 = XXH64_mergeRound(h64, v3); // h64 = XXH64_mergeRound(h64, v4); // } else { // h64 = seed + PRIME64_5; // } // h64 += (U64) len; // while (p+8<=bEnd) { // U64 k1 = XXH64_round(0, XXH_get64bits(p)); // h64 ^= k1; // h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; // p+=8; // } // if (p+4<=bEnd) { // h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1; // h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; // p+=4; // } // while (p<bEnd) { // h64 ^= (*p) * PRIME64_5; // h64 = XXH_rotl64(h64, 11) * PRIME64_1; // p++; // } // h64 ^= h64 >> 33; // h64 *= PRIME64_2; // h64 ^= h64 >> 29; // h64 *= PRIME64_3; // h64 ^= h64 >> 32; // return h64; //} //XXH_PUBLIC_API unsigned long long XXH64 ( void* input, size_t len, unsigned long long seed) //{ //#if 0 // /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ // XXH64_CREATESTATE_STATIC(state); // XXH64_reset(state, seed); // XXH64_update(state, input, len); // return XXH64_digest(state); //#else // XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; // if (XXH_FORCE_ALIGN_CHECK) { // if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ // if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) // return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); // else // return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); // } } // if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) // return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); // else // return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); //#endif //} ///* ************************************************** //* Advanced Hash Functions //****************************************************/ //XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) //{ // return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); //} //XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) //{ // XXH_free(statePtr); // return XXH_OK; //} //XXH_PUBLIC_API XXH64_state_t XXH64_createState(void) //{ // return (XXH64_state_t)XXH_malloc(sizeof(XXH64_state_t)); //} //XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t statePtr) //{ // XXH_free(statePtr); // return XXH_OK; //} ///*** Hash feed ***/ //XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed) //{ // XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ // memset(&state, 0, sizeof(state)-4); /* do not write into reserved, for future removal */ // state.v1 = seed + PRIME32_1 + PRIME32_2; // state.v2 = seed + PRIME32_2; // state.v3 = seed + 0; // state.v4 = seed - PRIME32_1; // memcpy(statePtr, &state, sizeof(state)); // return XXH_OK; //} public static XXH_errorcode XXH64_reset(XXH64_state_t statePtr, ulong seed) { XXH64_state_t state = statePtr; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ state.FillZero(); // memset(&state, 0, sizeof(state) - 8); /* do not write into reserved, for future removal */ state.v1 = seed + PRIME64_1 + PRIME64_2; state.v2 = seed + PRIME64_2; state.v3 = seed + 0; state.v4 = seed - PRIME64_1; // memcpy(statePtr, &state, sizeof(state)); return(XXH_errorcode.XXH_OK); }
//FORCE_INLINE_TEMPLATE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, void* input, size_t len, XXH_endianess endian) //{ // BYTE* p = ( BYTE*)input; // BYTE* bEnd = p + len; //#ifdef XXH_ACCEPT_NULL_INPUT_POINTER // if (input==NULL) return XXH_ERROR; //#endif // state->total_len_32 += (unsigned)len; // state->large_len |= (len>=16) | (state->total_len_32>=16); // if (state->memsize + len < 16) { /* fill in tmp buffer */ // XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len); // state->memsize += (unsigned)len; // return XXH_OK; // } // if (state->memsize) { /* some data left from previous update */ // XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize); // { U32* p32 = state->mem32; // state->v1 = XXH32_round(state->v1, XXH_readLE32(p32, endian)); p32++; // state->v2 = XXH32_round(state->v2, XXH_readLE32(p32, endian)); p32++; // state->v3 = XXH32_round(state->v3, XXH_readLE32(p32, endian)); p32++; // state->v4 = XXH32_round(state->v4, XXH_readLE32(p32, endian)); p32++; // } // p += 16-state->memsize; // state->memsize = 0; // } // if (p <= bEnd-16) { // BYTE* limit = bEnd - 16; // U32 v1 = state->v1; // U32 v2 = state->v2; // U32 v3 = state->v3; // U32 v4 = state->v4; // do { // v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4; // v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4; // v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4; // v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4; // } while (p<=limit); // state->v1 = v1; // state->v2 = v2; // state->v3 = v3; // state->v4 = v4; // } // if (p < bEnd) { // XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); // state->memsize = (unsigned)(bEnd-p); // } // return XXH_OK; //} //XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, void* input, size_t len) //{ // XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; // if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) // return XXH32_update_endian(state_in, input, len, XXH_littleEndian); // else // return XXH32_update_endian(state_in, input, len, XXH_bigEndian); //} //FORCE_INLINE_TEMPLATE U32 XXH32_digest_endian ( XXH32_state_t* state, XXH_endianess endian) //{ // BYTE * p = ( BYTE*)state->mem32; // BYTE* bEnd = ( BYTE*)(state->mem32) + state->memsize; // U32 h32; // if (state->large_len) { // h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18); // } else { // h32 = state->v3 /* == seed */ + PRIME32_5; // } // h32 += state->total_len_32; // while (p+4<=bEnd) { // h32 += XXH_readLE32(p, endian) * PRIME32_3; // h32 = XXH_rotl32(h32, 17) * PRIME32_4; // p+=4; // } // while (p<bEnd) { // h32 += (*p) * PRIME32_5; // h32 = XXH_rotl32(h32, 11) * PRIME32_1; // p++; // } // h32 ^= h32 >> 15; // h32 *= PRIME32_2; // h32 ^= h32 >> 13; // h32 *= PRIME32_3; // h32 ^= h32 >> 16; // return h32; //} //XXH_PUBLIC_API unsigned int XXH32_digest ( XXH32_state_t* state_in) //{ // XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; // if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) // return XXH32_digest_endian(state_in, XXH_littleEndian); // else // return XXH32_digest_endian(state_in, XXH_bigEndian); //} ///* **** XXH64 **** */ public static XXH_errorcode XXH64_update_endian(XXH64_state_t state, void *input, size_t len /*, XXH_endianess endian*/) { BYTE *p = (BYTE *)input; BYTE *bEnd = p + len; //#ifdef XXH_ACCEPT_NULL_INPUT_POINTER // if (input==NULL) return XXH_ERROR; //#endif state.total_len += len; if (state.memsize + len < 32) { /* fill in tmp buffer */ XXH_memcpy(((BYTE *)state.mem64) + state.memsize, input, len); state.memsize += (U32)len; return(XXH_errorcode.XXH_OK); } if (state.memsize != 0) { /* tmp buffer is full */ XXH_memcpy(((BYTE *)state.mem64) + state.memsize, input, 32 - state.memsize); state.v1 = XXH64_round(state.v1, XXH_readLE64(state.mem64 + 0 /*, endian*/)); state.v2 = XXH64_round(state.v2, XXH_readLE64(state.mem64 + 1 /*, endian*/)); state.v3 = XXH64_round(state.v3, XXH_readLE64(state.mem64 + 2 /*, endian*/)); state.v4 = XXH64_round(state.v4, XXH_readLE64(state.mem64 + 3 /*, endian*/)); p += 32 - state.memsize; state.memsize = 0; } if (p + 32 <= bEnd) { BYTE *limit = bEnd - 32; U64 v1 = state.v1; U64 v2 = state.v2; U64 v3 = state.v3; U64 v4 = state.v4; do { v1 = XXH64_round(v1, XXH_readLE64(p /*, endian*/)); p += 8; v2 = XXH64_round(v2, XXH_readLE64(p /*, endian*/)); p += 8; v3 = XXH64_round(v3, XXH_readLE64(p /*, endian*/)); p += 8; v4 = XXH64_round(v4, XXH_readLE64(p /*, endian*/)); p += 8; } while (p <= limit); state.v1 = v1; state.v2 = v2; state.v3 = v3; state.v4 = v4; } if (p < bEnd) { XXH_memcpy(state.mem64, p, (size_t)(bEnd - p)); state.memsize = (uint)(bEnd - p); } return(XXH_errorcode.XXH_OK); }