commit e54b4278361184bf6ff90f189898668160474f2f Author: George Kadianakis desnacked@riseup.net Date: Mon Jul 16 20:13:52 2012 +0200
Plot 'degree of anonymity' instead of entropy.
'Degree of anonymity' should give a more intuitive view of the situation. For more information, see section 3 of 'Towards measuring anonymity' by C. Diaz, S. Stefaan, J. Claessens and B. Preneel. --- task-6232/plot-entropy.R | 2 +- task-6232/pyentropy.py | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/task-6232/plot-entropy.R b/task-6232/plot-entropy.R index 95dbdcc..87035b9 100644 --- a/task-6232/plot-entropy.R +++ b/task-6232/plot-entropy.R @@ -10,7 +10,7 @@ d <- melt(d, "date") ggplot(d, aes(x = date, y = value, colour = variable)) + geom_line() + scale_x_date(name = "\nDate") + -scale_y_continuous(name = "Entropy\n") + +scale_y_continuous(name = "Degree of Anonymity\n") + scale_colour_hue(name = "Relays", breaks = c("all", "exit", "guard", "country"), labels = c("All relays", "All exits", "All guards", "All countries")) diff --git a/task-6232/pyentropy.py b/task-6232/pyentropy.py index b064339..abb716a 100644 --- a/task-6232/pyentropy.py +++ b/task-6232/pyentropy.py @@ -57,13 +57,16 @@ def run(file_name): router.add(key, values)
totalBW, totalExitBW, totalGuardBW = 0, 0, 0 + guards_n, exits_n = 0, 0 bw_countries = {} for router in routers: totalBW += router.bandwidth if router.is_guard: totalGuardBW += router.bandwidth + guards_n += 1 if router.is_exit: totalExitBW += router.bandwidth + exits_n += 1 if bw_countries.has_key(router.country): bw_countries[router.country] += router.bandwidth else: @@ -90,8 +93,18 @@ def run(file_name): p = float(bw_countries[country]) / float(totalBW) if p != 0: entropy_country += -(p * math.log(p, 2)) - - return ",".join([valid_after, str(entropy), str(entropy_exit), str(entropy_guard), str(entropy_country)]) + + # Entropy of uniform distribution of 'n' possible values: log(n) + max_entropy = math.log(len(routers), 2) + max_entropy_guard = math.log(guards_n, 2) + max_entropy_exit = math.log(exits_n, 2) + max_entropy_country = math.log(len(bw_countries), 2) + + return ",".join([valid_after, + str(entropy/max_entropy), + str(entropy_exit/max_entropy_exit), + str(entropy_guard/max_entropy_guard), + str(entropy_country/max_entropy_country)])
def usage(): print "Usage - python pyentropy.py <consensus-dir> <output-file>"
tor-commits@lists.torproject.org