zipf/pareto: mix blocks with hashing
[fio.git] / lib / zipf.c
index 34f28772682dba677a7da5d6d18a23fec57e0ed0..527ae294cf9afd6212151e004e2220163e25f888 100644 (file)
@@ -9,6 +9,7 @@
 #include "../log.h"
 #include "zipf.h"
 #include "../minmax.h"
+#include "../hash.h"
 #include "../os/os.h"
 
 struct fio_zipf_disk {
@@ -124,5 +125,23 @@ unsigned long long zipf_next(struct zipf_state *zs)
        else
                val = 1 + (unsigned long long)(n * pow(eta*rand_uni - eta + 1.0, alpha));
 
-       return val - 1;
+       return __hash_long(val - 1) % zs->nranges;
+}
+
+void pareto_init(struct zipf_state *zs, unsigned long nranges, double h)
+{
+       memset(zs, 0, sizeof(*zs));
+
+       zs->nranges = nranges;
+       zs->pareto_pow = log(h) / log(1.0 - h);
+
+       init_rand(&zs->rand);
+}
+
+unsigned long long pareto_next(struct zipf_state *zs)
+{
+       double rand = (double) __rand(&zs->rand) / (double) FRAND_MAX;
+       unsigned long long n = zs->nranges - 1;
+
+       return __hash_long(n * pow(rand, zs->pareto_pow)) % zs->nranges;
 }