Blame |
Last modification |
View Log
| Download
| RSS feed
#include <stdio.h>
#include <stdlib.h>
#include "mhmt-types.h"
#include "mhmt-hash.h"
// allocate mem for hash (length) and build it from data
// length must be at least 3 bytes, since hash[0] and hash[1] are not valid hashes
UBYTE
* build_hash
(UBYTE
* data
, ULONG length
, ULONG prebin_len
)
{
UBYTE
* hash
;
ULONG i
; UBYTE
*src
,*dst
;
UBYTE curr
,prev
,prev2
;
if( !length
)
return NULL
;
hash
=(UBYTE
*)malloc( length
+prebin_len
);
if( !hash
)
return NULL
;
prev
=curr
=0;
i
=length
+prebin_len
;
src
= data
-prebin_len
;
dst
= hash
;
do
{
prev2
= (UBYTE
)( (prev
>>1) | (prev
<<7) );
prev
= (UBYTE
)( (curr
>>1) | (curr
<<7) );
curr
= *(src
++);
*(dst
++) = curr
^prev
^prev2
;
} while( --i
);
return hash
+prebin_len
; // negative indices must be used to access prebin hashes
}
// free hash
void destroy_hash
(UBYTE
* hash
, ULONG prebin_len
)
{
if( hash
) free(hash
-prebin_len
);
}