From ff8598bd118ef33af2937a9c9b56cd47b310f576 Mon Sep 17 00:00:00 2001 From: taivop Date: Mon, 17 Oct 2016 14:28:46 +0200 Subject: [PATCH] fix #80 --- report/milestone1.pdf | Bin 270209 -> 270820 bytes report/milestone1.tex | 33 +++++++++++++-------------- src/main/java/asl/UniformHasher.java | 9 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/report/milestone1.pdf b/report/milestone1.pdf index b03851b0fc398eaf46d1301c12b7392fd2db99f0..0d7d7db0ffd56cc4e9c24ff4a5fed414da382ade 100644 GIT binary patch delta 18306 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 Ks_N?R#svW58q{9^ diff --git a/report/milestone1.tex b/report/milestone1.tex index 671d3be..b15ed35 100644 --- a/report/milestone1.tex +++ b/report/milestone1.tex @@ -99,29 +99,28 @@ \subsection{Overall Architecture}\label{sec:desc:architecture} \subsection{Load Balancing and Hashing}\label{sec:desc:hashing} -The hashing is implemented by \linkmain{UniformHasher}. The hashing scheme for a given key s works as follows: +The hashing is implemented by \linkmain{UniformHasher}. The hashing scheme for a given key works as follows: \begin{enumerate} -\item s is hashed into a 32-bit signed integer using Java's native \code{String.hashCode()}. -\item The hash is used to set the seed of a random number generator (\code{java.util.Random}). -\item The first random number that the generator returns is used. +\item s is hashed into a 32-bit signed integer $i$ using Java's native \code{String.hashCode()}. +\item The index of the primary machine is calculated as $i \bmod N$ (adding $N$ if the modulus is negative), where $N$ is the number of servers. \end{enumerate} The uniformity of hashing was also validated in tests (see \linktest{UniformHasherTest}). For 1 million random strings and 13 target machines, the distribution to different machines was the following: \begin{verbatim} -Machine 0 got 76706 hits. -Machine 1 got 76896 hits. -Machine 2 got 76718 hits. -Machine 3 got 76829 hits. -Machine 4 got 77102 hits. -Machine 5 got 76980 hits. -Machine 6 got 76467 hits. -Machine 7 got 76940 hits. -Machine 8 got 77194 hits. -Machine 9 got 76896 hits. -Machine 10 got 77107 hits. -Machine 11 got 76785 hits. -Machine 12 got 77380 hits. +Machine 0 got 77229 hits. +Machine 1 got 76702 hits. +Machine 2 got 76769 hits. +Machine 3 got 76860 hits. +Machine 4 got 76773 hits. +Machine 5 got 77169 hits. +Machine 6 got 76650 hits. +Machine 7 got 76831 hits. +Machine 8 got 77061 hits. +Machine 9 got 76955 hits. +Machine 10 got 76644 hits. +Machine 11 got 77432 hits. +Machine 12 got 76925 hits. \end{verbatim} As apparent, the distribution is indeed uniform. diff --git a/src/main/java/asl/UniformHasher.java b/src/main/java/asl/UniformHasher.java index 1ccf8dc..368fdf3 100644 --- a/src/main/java/asl/UniformHasher.java +++ b/src/main/java/asl/UniformHasher.java @@ -35,10 +35,11 @@ public UniformHasher(Integer numMemcachedServers, Integer replicationFactor) { */ @Override public Integer getPrimaryMachine(String s) { - Random r = new Random(); - r.setSeed(s.hashCode()); - - return r.nextInt(numMachines); + int index = s.hashCode() % numMachines; + if(index < 0) { + index += numMachines; + } + return index; } /**