radare2/libr/hash/entropy.c
2011-03-08 13:02:02 +01:00

42 lines
987 B
C

/*
* This code was done
* by an anonymous gnome
* ------------------------
* That's pure mathematics, so no sense to adding license shit here.
*/
#include <stdlib.h>
#include <math.h>
#include "r_types.h"
static double get_px(ut8 x, const ut8 *data, ut64 size) {
ut32 i, count = 0;
for (i = 0; i < size; i++)
if (data[i] == x)
count++;
return (double)count/size;
}
R_API double r_hash_entropy(const ut8 *data, ut64 size) {
double h = 0, px, log2;
unsigned int x;
log2 = log ((double)2);
for (x = 0; x <= 255; x++) {
px = get_px (x, data, size);
if (px > 0)
h += -px * (log (px)/log2);
}
return h;
}
R_API double r_hash_entropy_fraction(const ut8 *data, ut64 size) {
double h = r_hash_entropy(data,size);
if (size>255) return h/8;
else {
double log2 = log((double)2);
return h*log2/log(size);
}
}