<?xml version="1.0" encoding="utf-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.26 (Ruby 2.6.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC6790 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6790.xml">
<!ENTITY RFC4221 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4221.xml">
<!ENTITY RFC3032 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3032.xml">
<!ENTITY I-D.bocci-mpls-miad-adi-requirements SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.bocci-mpls-miad-adi-requirements.xml">
<!ENTITY I-D.andersson-mpls-mna-fwk SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.andersson-mpls-mna-fwk.xml">
]>


<rfc ipr="trust200902" docName="draft-li-mpls-entropy-01" category="info" submissionType="IETF">
  <front>
    <title abbrev="Entropy Values">Entropy Values</title>

    <author initials="T." surname="Li" fullname="Tony Li">
      <organization>Juniper Networks</organization>
      <address>
        <email>tony.li@tony.li</email>
      </address>
    </author>

    <date year="2022" month="May" day="12"/>

    
    <workgroup>MPLS Working Group</workgroup>
    

    <abstract>


<t>Equal Cost Multi-Path (ECMP) forwarding is an essential function in
distributing traffic across parallel paths. Packets within a flow must
be kept on a single path to avoid reordering, while different flows
must be distributed across paths to achieve parallelism.</t>

<t>Previously, MPLS has addressed this through the use of an entropy
label, providing up to 20 bits of entropy that can be added to the
label stack to distinguish different flows. <xref target="RFC6790"/> With the
interest in MPLS Network Actions, there are proposals to 
embedding entropy into alternate structures, so it is an appropriate
time to consider how many bits should be used for entropy in the
future. <xref target="I-D.bocci-mpls-miad-adi-requirements"/><xref target="I-D.andersson-mpls-mna-fwk"/></t>

<t>In this document, we examine the question of how to provide adequate
entropy through a simple stochastic simulation. This is not intended
to be a comprehensive and extensive treatise, but rather a simple
investigation to build intuition into the issues.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<t>Equal Cost Multi-Path (ECMP) forwarding is an essential function in
distributing traffic across parallel paths. Packets within a flow must
be kept on a single path to avoid reordering, while different flows
must be distributed across paths to achieve parallelism.</t>

<t>Previously, MPLS has addressed this through the use of an entropy
label, providing up to 20 bits of entropy that can be added to the
label stack to distinguish different flows. <xref target="RFC6790"/> With the
interest in MPLS Network Actions, there are proposals to 
embedding entropy into alternate structures, so it is an appropriate
time to consider how many bits should be used for entropy in the
future. <xref target="I-D.bocci-mpls-miad-adi-requirements"/><xref target="I-D.andersson-mpls-mna-fwk"/></t>

<t>In this document, we examine the question of how to provide adequate
entropy through a simple stochastic simulation. This is not intended
to be a comprehensive and extensive treatise, but rather a simple
investigation to build intuition into the issues.</t>

<section anchor="model"><name>Model</name>

<t>In a typical ECMP situation, a Label Edge Router (LER) <xref target="RFC4221"/>
would examine incoming traffic and use values in the incoming packet
to compute an Entropy Label (EL). This would be placed in the label
stack.  Subsequent routers on the path could use this EL as input to a
hashing function and the resulting hash value would then be used to
select one of the possible output paths. If the entropy label and the
hashing function are implemented correctly, packets would be uniformly
distributed across the possible paths. If packet sizes are uniformly
distributed, this would also imply that bandwidth would be uniformly
distributed across paths.</t>

<t>Moving forward, we expect that entropy will continue to be carried in
the label stack, but may not occupy a Label field inside of a Label
Stack Entry (LSE) <xref target="RFC3032"/>.  We generalize this to an Entropy
Value (EV) and seek to understand the necessary size of this field.</t>

</section>
<section anchor="methodology"><name>Methodology</name>

<t>To study this, we employ a pseudo-random number generator to create
Entropy Values and then we apply a hashing function to them. Ideally,
the results of the hash will be uniformly distributed. Error metrics
are used to characterize how far results are from this ideal.</t>

</section>
</section>
<section anchor="randomness"><name>Randomness</name>

<t>Real hardware does not use a random number generator to create
entropy. Doing so would require mapping each flow to an entropy value
and this would be painful to implement due to scale. Rather,
implementations that we are familiar with use a hashing function on
the packet header to create an entropy value. Ideally, the results of
this would be uniformly distributed. However, we cannot assume that
all traffic will be quite so cooperative.</t>

<t>Conversely, we also cannot assume that the LER will generate no
entropy.  If an LER does nothing except place a constant in the
entropy value, no downstream hashing function will be able to extract
any entropy.</t>

<t>To model this, we intentionally choose an imperfect random number
generator, specifically, we choose one that has a normal
distribution (i.e., Gaussian or bell curve). This should produce many
different entropy values and if the hashing function is doing its job,
the resulting entropy should result in a uniform distribution of hash
values.</t>

</section>
<section anchor="hashing"><name>Hashing</name>

<t>Similarly, there is no standardized way of implementing the hash
function that downstream routers will use to convert an entropy value
into a hash value. In cases where the entropy value has more bits than
the hash value can support, it is up to the hashing function to fold
the entropy from all of the entropy value bits into the hash value.</t>

<t>Thus, we consider a number of hashing functions:</t>

<t><list style="symbols">
  <t>Addition: High order bits are added to the low order bits to produce
the hash value.</t>
  <t>Masking: High order bits are simply discarded.</t>
  <t>Mixing and Masking: Bits are shifted, added, and then masked.</t>
  <t>Xor: High order bits are XOR'ed into the low order bits.</t>
  <t>CRC-CCITT: Compute a CRC over the entropy value and XOR the
resulting bits together.</t>
  <t>MD4: Compute the MD4 digest over the entropy value and XOR the
resulting bits together.</t>
  <t>MD4: Compute the MD5 digest over the entropy value and XOR the
resulting bits together.</t>
  <t>SHA1: Compute the SHA1 digest over the entropy value and XOR the
resulting bits together.</t>
  <t>SHA256: Compute the SHA256 digest over the entropy value and XOR the
resulting bits together.</t>
</list></t>

<t>Some of these hash functions work better than others.  Additional hash
functions could easily be added.</t>

<t>To simplify our simulation, we have primarily focused on hashes that
have a range that is a power of two. However, in a practical
application, that is not appropriate and the range must be an
arbitrary integer, so that we can support n-way ECMP. This is
discussed further below.</t>

</section>
<section anchor="Hardware"><name>Future Hardware Considerations</name>

<t>When ECMP was first implemented, 4-way ECMP was the norm.  In the
early days of sparse networks, that was frequently adequate. As the
number of interfaces on a router has grown, ECMP has followed suit,
and 128-way and 256-way ECMP is now in production.</t>

<t>While hardware has provided an impetetus to grow the breadth of ECMP,
it is also suggesting that there is an upper bound to what needs to be
supported. It is fairly clear that with current networking trends, we
will never need more paths from a single router than it has physical
interfaces.  While logically, more would be possible, the growth in
bandwidth has driven the need for ECMP and that bandwidth is most
easily provided through the use of non-fractional interfaces.</t>

<t>Concurrently, we note a trend away from building multi-chassis routers
with an arbitrary number of physical interfaces, so this implies a
bound of around 1000 physical interface per router for the foreseable
future.</t>

<t>Hardware is also most conveniently impelemented on power of two
boundaries.  Thus, we investigate ECMP from 4-way to 4096-way, in
powers of two.</t>

</section>
<section anchor="results"><name>Results</name>

<t>For hash values from 8 to 12 bits, we consider entropy values with 0
to 5 additional bits (i.e., 8 to 17 bits). We generate enough random
samples so that each hash bucket should ideally have 1000 entries.</t>

<t>The error for each has bucket is then difference between the number of
hash results and 1000.  We then compute the following error metrics
for each combination of algorithm, hash value bits, and additional
bits:</t>

<t><list style="symbols">
  <t>Root Mean Square Error (RMSE): The Root Mean Square Error is the
square root of the sum of the squares of the errors for each bucket,
divided by the number of buckets.</t>
  <t>Mean Average Error (MAE): The Mean Average Error is the arithmetic
mean of the absolute value of the error for each bucket.</t>
  <t>Mean Average Percentage Error (MAPE): The Mean Average Percentage
Error is the arithmetic mean of the percentage of error for each
bucket.</t>
</list></t>

<t>We then summarize the results based on the number of additional bits
and on algorithm, computing the mean of each of the above metrics.</t>

</section>
<section anchor="conclusion"><name>Conclusion</name>

<t>The arguments in <xref target="Hardware"/> suggest that 4096-way ECMP will be
sufficient for some time to come. This suggests that a base of 12 bits
would be a good start.</t>

<t>We arbitrarily select a MAPE of 5.0 as a threshold of acceptability.
This represents a distribution that is within 5% of our goal of a
uniform distribution.</t>

<t>A solution to the issue would be a number of bits entropy value and a
set of hashing algorithms that would provide acceptable performance
over the full range of hash values, from 2 to 12 bits.</t>

<t>We observe that for some entropy values, we get unacceptable solutions
across all algorithms:</t>

<figure><artwork><![CDATA[
For 2-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add | 687.0 | 687.0 | 68.7 |
|      mask | 378.0 | 378.0 | 37.8 |
|       xor | 687.0 | 687.0 | 68.7 |
| crc-ccitt | 687.0 | 687.0 | 68.7 |
|       md4 | 687.0 | 687.0 | 68.7 |
|       md5 | 376.0 | 376.0 | 37.6 |
|      sha1 | 378.0 | 378.0 | 37.8 |
|    sha256 | 378.0 | 378.0 | 37.8 |
+-----------+-------+-------+------+
]]></artwork></figure>
<t>Clearly, a 2 bit entropy value is not acceptable.</t>

<t>We also observe that some algorithms perform better than others:</t>

<figure><artwork><![CDATA[
For 16-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  46.0 |  35.0 |  3.5 |
|      mask |  30.1 |  27.2 |  2.7 |
|       xor |  48.3 |  43.9 |  4.4 |
| crc-ccitt |  24.4 |  19.9 |  2.0 |
|       md4 | 234.5 | 197.4 | 19.7 |
|       md5 | 262.5 | 196.1 | 19.6 |
|      sha1 | 183.4 | 150.0 | 15.0 |
|    sha256 | 281.1 | 251.2 | 25.1 |
+-----------+-------+-------+------+
]]></artwork></figure>

<t>Understanding why some algorithms perform poorly is not understood at
this time and a subject for future research.</t>

<t>Once we reach about 10 bits of entropy value, most algorithms work
well, most of the time:</t>

<figure><artwork><![CDATA[
For 1024-way ECMP with 0 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.2 | 25.8 |  2.6 |
|      mask | 32.6 | 26.2 |  2.6 |
|       xor | 33.5 | 26.6 |  2.7 |
| crc-ccitt | 31.2 | 24.9 |  2.5 |
|       md4 | 55.4 | 44.4 |  4.4 |
|       md5 | 55.9 | 44.7 |  4.5 |
|      sha1 | 57.2 | 45.4 |  4.5 |
|    sha256 | 57.0 | 46.1 |  4.6 |
+-----------+------+------+------+

For 256-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 30.3 | 23.9 |  2.4 |
|      mask | 32.6 | 26.2 |  2.6 |
|       xor | 28.9 | 23.1 |  2.3 |
| crc-ccitt | 35.2 | 28.0 |  2.8 |
|       md4 | 59.0 | 46.5 |  4.6 |
|       md5 | 54.7 | 44.0 |  4.4 |
|      sha1 | 56.8 | 44.3 |  4.4 |
|    sha256 | 54.5 | 44.1 |  4.4 |
+-----------+------+------+------+
]]></artwork></figure>

<t>If we look at summaries by additional bits and by algorithm we see:</t>

<figure><artwork><![CDATA[
Error per added bit
+------------+-------+-------+-------+
| Added bits | MRMSE |  MMAE | MMAPE |
+------------+-------+-------+-------+
|          0 | 171.0 | 150.6 |  15.1 |
|          1 | 115.8 | 100.2 |  10.0 |
|          2 |  74.9 |  61.6 |   6.2 |
|          3 |  58.5 |  49.0 |   4.9 |
|          4 |  51.1 |  43.2 |   4.3 |
|          5 |  47.1 |  39.8 |   4.0 |
+------------+-------+-------+-------+

Error per algorithm
+-----------+-------+-------+-------+
| Algorithm | MRMSE |  MMAE | MMAPE |
+-----------+-------+-------+-------+
|       add |  52.7 |  45.8 |   4.6 |
|      mask |  34.1 |  28.6 |   2.9 |
|       xor |  54.0 |  48.0 |   4.8 |
| crc-ccitt |  48.7 |  43.2 |   4.3 |
|       md4 | 137.7 | 119.8 |  12.0 |
|       md5 | 131.3 | 110.7 |  11.1 |
|      sha1 | 110.5 |  93.0 |   9.3 |
|    sha256 | 122.2 | 103.3 |  10.3 |
+-----------+-------+-------+-------+
]]></artwork></figure>

<t>This leads us to propose that use at least 4 additional bits for our
entropy value, resulting in total of 16 (12 + 4). Please note that
this is a minimum. Most proposals are proposing higher numbers of
bits, thus exceeding this minimum.</t>

</section>
<section anchor="validation"><name>Validation</name>

<t>To further validate that 16 bits of entropy is sufficient, we also
simulated hashing with a non-power of two result to support n-way
ECMP.  To map the hash to a range of n possible results, we performed
a 'mod n' operation after each of the above hashes. We then selected
10 random n values that are not powers of two and repeated the above
experiment.</t>

<t>In this step, we generated 16 bits of entropy, hashed that and then
folded it to down to 16 bits. We then applied the 'mod n' operation to
get down to a range of n results. In these circumstances, the 'add',
'mask', and 'xor' hashes are all identical and result in no changes,
as they simply are the identity function on 16 bits. The 'add' and
'xor' functions were removed for efficiency.</t>

<t>The results demonstrate that the 'mask' (identity) function performs
adequately in this circumstance, again supporting the claim that 16
bits is sufficient entropy.</t>

<figure><artwork><![CDATA[
For 3023-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.8 |  25.6 |  2.6 |
| crc-ccitt | 238.2 | 191.1 | 19.1 |
|       md4 | 320.7 | 254.9 | 25.5 |
|       md5 | 319.7 | 253.8 | 25.4 |
|      sha1 | 329.1 | 262.8 | 26.3 |
|    sha256 | 328.0 | 261.6 | 26.2 |
+-----------+-------+-------+------+
]]></artwork></figure>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>No security issues are discussed in this document.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document makes no requests of IANA.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC6790;
&RFC4221;
&RFC3032;


    </references>

    <references title='Informative References'>

&I-D.bocci-mpls-miad-adi-requirements;
&I-D.andersson-mpls-mna-fwk;


    </references>


<section anchor="source-code"><name>Source Code</name>

<figure><sourcecode type="python"><![CDATA[
#!/usr/bin/python3
#
# Copyright 2022, Juniper Networks, Inc.
# Tony Li (tli)
#
# Statistical study on the number of entropy bits necessary.
#
# Equal Cost Multi-Path (ECMP) forwarding directs traffic down
# multiple paths. An entropy label is included in the MPLS label
# stack or in the MPLS Network Action sub-stack to help
# implementations keep individual flows on a consistent path but
# spread different flows across different paths.
#
# The entropy label is supposed to be used by an implementation
# as input to a hash function, producing a hash value that is an
# index into the set of paths. If the hash values are uniformly
# distributed, then the paths will be equally used. If the hash
# function is poor or there is not enough entropy in the entropy
# label, then the hash values will not be uniformly distribute.
#
# To gain some intuition about how many bits of entropy are
# necessary, we simulate the hashing of a large number of random
# values and then measure the uniformity of the results.
#

import crcmod
from numpy import random, round
import matplotlib.pyplot as plt
import math
from tabulate import tabulate
import binascii
import hashlib

# To get an interesting volume of data, we need about this many
# samples per bucket.
DEPTH = 1000

# ECMP is typically up to N way, where N is 2 ** P.  We study a
# range of P values to get an understanding of the number of
# necessary bits as a function of P.

P_RANGE = range(1, 13)
#P_RANGE = range(2, 6)

# Consider this many additional bits of entropy, above and beyond
# P.
MORE_BITS_RANGE = range(0, 6)

# Format for floating point numbers
FLT = '%.1f'

class HashFunc(object):
   def __init__ (self, p, name):
      self.bits = p
      self.name = name
      # Mask of bits inside of the target range
      self.lowmask = (2 ** p - 1)
      # Mask of bits outside of the target range
      self.highmask = ~self.lowmask

   def hashfunc(self, v):
      raise NotImplementedError()

class AddHash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'add')

   def hashfunc(self, v):
      old = v
      if self.highmask & v:
         v = (v & self.lowmask) + ((v & self.highmask) >>
                                   self.bits)
      return v & self.lowmask

class MaskHash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'mask')

   def hashfunc(self, v):
      return v & self.lowmask

class XorHash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'xor')

   def hashfunc(self, v):
      while self.highmask & v:
         v = (v & self.lowmask) ^ ((v & self.highmask) >>
                                   self.bits)
      return v

class CrcHash(HashFunc):
   # CRC-CCITT
   def __init__(self, p):
      super().__init__(p, 'crc-ccitt')

   def hashfunc(self, v):
      v = binascii.crc_hqx(v.to_bytes(4, 'little'), 0)
      while self.highmask & v:
         v = (v & self.lowmask) ^ ((v & self.highmask) >>
                                   self.bits)
      return v

class Md4Hash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'md4')
      self.func = hashlib.new('md4')

   def hashfunc(self, v):
      m = self.func.copy()
      m.update(v.to_bytes(4, 'little'))
      d = m.digest()
      v = int.from_bytes(d, 'little')
      while self.highmask & v:
         v = (v & self.lowmask) ^ ((v & self.highmask) >>
                                   self.bits)
      return v

class Md5Hash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'md5')
      self.func = hashlib.md5()

   def hashfunc(self, v):
      m = self.func.copy()
      m.update(v.to_bytes(4, 'little'))
      d = m.digest()
      v = int.from_bytes(d, 'little')
      while self.highmask & v:
         v = (v & self.lowmask) ^ ((v & self.highmask) >>
                                   self.bits)
      return v

class Sha1Hash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'sha1')
      self.func = hashlib.sha1()

   def hashfunc(self, v):
      m = self.func.copy()
      m.update(v.to_bytes(4, 'little'))
      d = m.digest()
      v = int.from_bytes(d, 'little')
      while self.highmask & v:
         v = (v & self.lowmask) ^ ((v & self.highmask) >>
                                   self.bits)
      return v

class Sha256Hash(HashFunc):
   def __init__(self, p):
      super().__init__(p, 'sha256')
      self.func = hashlib.sha256()

   def hashfunc(self, v):
      m = self.func.copy()
      m.update(v.to_bytes(4, 'little'))
      d = m.digest()
      v = int.from_bytes(d, 'little')
      while self.highmask & v:
         v = (v & self.lowmask) ^ ((v & self.highmask) >>
                                   self.bits)
      return v

def rmse( error ):
   # Compute the root mean square error of this run.
   errsq = [ err ** 2 for err in error ]
   rmse = math.sqrt( sum( errsq ) / len( error ) )
   return rmse

def mae( error ):
   # Compute the mean average error of this run.
   mae = sum( [ abs( err ) for err in error ] ) / len( error )
   return mae

def mape( error ):
   # Compute the mean average percentage error of this run.
   mape = 0.0
   for ( ind, err ) in enumerate( error ):
      if err != 0.0:
         mape += abs( err / DEPTH)
   mape = mape / len( error )
   return mape * 100.0

def mean(vec):
   return sum(vec)/len(vec)

def samples(buckets, bits):
   # Uniform distribution
   #samples = random.randint(0, (2 ** bits), buckets * DEPTH)
   # Normal distribution
   # This emulates a 'poor' random number generator
   floats = random.normal(2 ** (bits - 1),
                          scale=2 ** (bits - 3),
                          size=(buckets * DEPTH))
   rounded = round(floats)
   samples = [ int(x) for x in rounded ]
   samples = [ x if x > 0 else -x for x in samples ]
   samples = [ x if x < 2 ** bits else (2 ** bits - 1) for x in
               samples ]
   # Debugging
   # print (samples)
   #
   #count, bins, ignored = plt.hist(samples, bins = 2 ** bits)
   #plt.title('Random samples using %d bits of entropy' %
   #          bits)
   #plt.show()
   #
   return samples

headers = ['Hash', 'RMSE', 'MAE', 'MAPE']
summary_headers = ['Added bits', 'MRMSE', 'MMAE', 'MMAPE']
algo_summary_headers = ['Algorithm', 'MRMSE', 'MMAE', 'MMAPE']

def power_of_two():

   def simulate(p, bits):
      total = p + bits
      entropy = samples(2 ** p, total)
      hashes = [ AddHash(p), MaskHash(p), XorHash(p), CrcHash(p),
                 Md4Hash(p), Md5Hash(p), Sha1Hash(p),
                 Sha256Hash(p) ]
      results = []
      for h in hashes:
         hashvals = [ h.hashfunc(x) for x in entropy ]
         # print(hashvals)
         buckets = [ 0 ] * 2 ** p
         for x in hashvals:
            buckets[x] += 1
         # print(h.name, buckets, sum(buckets))
         error = [ DEPTH - x for x in buckets ]
         # print(error)
         # print(rmse(error), mae(error), mape(error))
         results.append( [ h.name, FLT % rmse(error), FLT %
                           mae(error), FLT % mape(error) ] )
      return results

   summary = []
   per_algo = {}
   for more in MORE_BITS_RANGE:
      per_bit = []
      for p in P_RANGE:
         print( 'For %d-way ECMP with %d more bits of entropy:' %
                (2 ** p, more))
         results = simulate(p, p + more)
         print(tabulate(results, headers=headers, tablefmt='pretty',
                        stralign='right'))
         rmsevec = [ float(x[1]) for x in results ]
         maevec = [ float(x[2]) for x in results ]
         mapevec = [ float(x[3]) for x in results ]
         per_bit.append([FLT % mean(rmsevec), FLT % mean(maevec),
                         FLT % mean(mapevec)])
         print()

         for result in results:
            if not per_algo.get(result[0]):
               per_algo[result[0]] = [ [], [], [] ]
            for i in range(1,4):
               per_algo[result[0]][i-1].append(float(result[i]))

      rmsevec = [ float(x[0]) for x in per_bit ]
      maevec = [ float(x[1]) for x in per_bit ]
      mapevec = [ float(x[2]) for x in per_bit ]
      summary.append([more, FLT % mean(rmsevec), FLT % mean(maevec),
                      FLT % mean(mapevec)])

   print('Error per added bit')
   print(tabulate(summary, headers=summary_headers,
                  tablefmt='pretty', stralign='right'))

   algo_summary = []
   for algo in per_algo:
      algo_summary.append([algo,
                           FLT % mean(per_algo[algo][0]),
                           FLT % mean(per_algo[algo][1]),
                           FLT % mean(per_algo[algo][2])])
   print('\nError per algorithm')
   print(tabulate(algo_summary, headers=algo_summary_headers,
                  tablefmt='pretty', stralign='right'))

def multibit():
   # Analyze hashes for non-power-of-two ranges.
   ENTROPY_BITS = 16
   SAMPLES = 10

   # For this case, Add, Xor, and Mask are equivalent: a NOP
   hashes = [ #AddHash(ENTROPY_BITS), XorHash(ENTROPY_BITS),
      MaskHash(ENTROPY_BITS), CrcHash(ENTROPY_BITS),
      Md4Hash(ENTROPY_BITS), Md5Hash(ENTROPY_BITS),
      Sha1Hash(ENTROPY_BITS), Sha256Hash(ENTROPY_BITS) ]

   def waygen():
      start = 2 ** min(P_RANGE)
      stop = 2 ** max(P_RANGE)
      for x in range(start, stop):
         # Don't bother with powers of two again.
         if x & (x - 1) != 0:
            yield x

   def simulate(nways):
      entropy = samples(nways, ENTROPY_BITS)
      results = []
      for h in hashes:
         hashvals = [ h.hashfunc(x) for x in entropy ]
         # print(hashvals)
         buckets = [ 0 ] * nways
         for x in hashvals:
            buckets[x % nways] += 1
         #print(h.name, buckets, sum(buckets))
         error = [ DEPTH - x for x in buckets ]
         # print(error)
         results.append( [ h.name, FLT % rmse(error), FLT %
                           mae(error), FLT % mape(error) ] )
      return results

   per_way = []
   nways = [ x for x in waygen() ]
   for nway in random.choice(nways, size=SAMPLES, replace=False):
      results = simulate(nway)
      print('\nFor %d-way ECMP, %d bits of entropy:' %
            (nway, ENTROPY_BITS))
      print(tabulate(results, headers=headers, tablefmt='pretty',
                     stralign='right'))
      # print('%d-way' % nway)

      rmsevec = [ float(x[1]) for x in results ]
      maevec = [ float(x[2]) for x in results ]
      mapevec = [ float(x[3]) for x in results ]
      per_way.append([nway, FLT % mean(rmsevec),
                      FLT % mean(maevec), FLT % mean(mapevec)])

   summary_headers = ['n-ways', 'MRMSE', 'MMAE', 'MMAPE']
   print('\nFor n-way ECMP, with %d bits of entropy, '
         'across hash functions' % ENTROPY_BITS)
   print(tabulate(per_way, headers=summary_headers,
                  tablefmt='pretty',
                  stralign='right'))

power_of_two()
multibit()
]]></sourcecode></figure>

</section>
<section anchor="full-results"><name>Full results</name>
<figure><artwork><![CDATA[
For 2-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add | 687.0 | 687.0 | 68.7 |
|      mask | 378.0 | 378.0 | 37.8 |
|       xor | 687.0 | 687.0 | 68.7 |
| crc-ccitt | 687.0 | 687.0 | 68.7 |
|       md4 | 687.0 | 687.0 | 68.7 |
|       md5 | 376.0 | 376.0 | 37.6 |
|      sha1 | 378.0 | 378.0 | 37.8 |
|    sha256 | 378.0 | 378.0 | 37.8 |
+-----------+-------+-------+------+

For 4-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add | 376.0 | 315.5 | 31.6 |
|      mask |  39.0 |  36.5 |  3.7 |
|       xor | 470.9 | 444.0 | 44.4 |
| crc-ccitt |  56.5 |  48.5 |  4.9 |
|       md4 | 990.4 | 936.0 | 93.6 |
|       md5 | 532.6 | 504.0 | 50.4 |
|      sha1 | 593.1 | 500.0 | 50.0 |
|    sha256 | 358.4 | 260.5 | 26.1 |
+-----------+-------+-------+------+

For 8-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add | 167.9 | 150.8 | 15.1 |
|      mask |  35.5 |  28.8 |  2.9 |
|       xor | 227.2 | 213.2 | 21.3 |
| crc-ccitt | 443.4 | 442.5 | 44.2 |
|       md4 | 355.3 | 277.8 | 27.8 |
|       md5 | 292.2 | 252.2 | 25.2 |
|      sha1 | 321.3 | 284.8 | 28.5 |
|    sha256 | 439.9 | 377.8 | 37.8 |
+-----------+-------+-------+------+

For 16-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  75.4 |  60.1 |  6.0 |
|      mask |  40.2 |  35.8 |  3.6 |
|       xor | 120.2 | 112.0 | 11.2 |
| crc-ccitt |  33.6 |  28.6 |  2.9 |
|       md4 | 423.0 | 316.2 | 31.6 |
|       md5 | 374.6 | 272.2 | 27.2 |
|      sha1 | 345.7 | 282.9 | 28.3 |
|    sha256 | 407.9 | 285.5 | 28.5 |
+-----------+-------+-------+------+

For 32-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  50.9 |  44.6 |  4.5 |
|      mask |  32.1 |  26.8 |  2.7 |
|       xor |  58.5 |  48.7 |  4.9 |
| crc-ccitt |  32.7 |  29.1 |  2.9 |
|       md4 | 251.6 | 191.8 | 19.2 |
|       md5 | 245.9 | 202.4 | 20.2 |
|      sha1 | 274.4 | 228.1 | 22.8 |
|    sha256 | 257.5 | 211.2 | 21.1 |
+-----------+-------+-------+------+

For 64-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  33.5 |  26.2 |  2.6 |
|      mask |  25.1 |  18.7 |  1.9 |
|       xor |  33.1 |  27.1 |  2.7 |
| crc-ccitt |  32.9 |  26.4 |  2.6 |
|       md4 | 204.7 | 168.9 | 16.9 |
|       md5 | 173.4 | 140.5 | 14.0 |
|      sha1 | 227.9 | 182.1 | 18.2 |
|    sha256 | 165.2 | 131.5 | 13.2 |
+-----------+-------+-------+------+

For 128-way ECMP with 0 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  27.8 |  22.4 |  2.2 |
|      mask |  30.9 |  24.8 |  2.5 |
|       xor |  34.2 |  26.9 |  2.7 |
| crc-ccitt |  33.2 |  27.0 |  2.7 |
|       md4 | 131.9 | 105.5 | 10.5 |
|       md5 | 123.1 | 100.9 | 10.1 |
|      sha1 | 129.5 | 106.8 | 10.7 |
|    sha256 | 133.4 | 105.0 | 10.5 |
+-----------+-------+-------+------+

For 256-way ECMP with 0 more bits of entropy:
+-----------+-------+------+------+
|      Hash |  RMSE |  MAE | MAPE |
+-----------+-------+------+------+
|       add |  29.6 | 23.8 |  2.4 |
|      mask |  31.4 | 25.1 |  2.5 |
|       xor |  32.5 | 26.1 |  2.6 |
| crc-ccitt |  31.2 | 24.9 |  2.5 |
|       md4 |  94.6 | 76.1 |  7.6 |
|       md5 | 100.6 | 81.3 |  8.1 |
|      sha1 | 102.3 | 81.1 |  8.1 |
|    sha256 |  98.6 | 79.6 |  8.0 |
+-----------+-------+------+------+

For 512-way ECMP with 0 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.4 | 24.9 |  2.5 |
|      mask | 32.2 | 25.8 |  2.6 |
|       xor | 34.1 | 27.0 |  2.7 |
| crc-ccitt | 30.7 | 25.0 |  2.5 |
|       md4 | 72.6 | 58.2 |  5.8 |
|       md5 | 71.7 | 56.6 |  5.7 |
|      sha1 | 77.6 | 62.1 |  6.2 |
|    sha256 | 72.2 | 57.6 |  5.8 |
+-----------+------+------+------+

For 1024-way ECMP with 0 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.2 | 25.8 |  2.6 |
|      mask | 32.6 | 26.2 |  2.6 |
|       xor | 33.5 | 26.6 |  2.7 |
| crc-ccitt | 31.2 | 24.9 |  2.5 |
|       md4 | 55.4 | 44.4 |  4.4 |
|       md5 | 55.9 | 44.7 |  4.5 |
|      sha1 | 57.2 | 45.4 |  4.5 |
|    sha256 | 57.0 | 46.1 |  4.6 |
+-----------+------+------+------+

For 2048-way ECMP with 0 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.5 | 25.1 |  2.5 |
|      mask | 31.3 | 25.0 |  2.5 |
|       xor | 31.9 | 25.6 |  2.6 |
| crc-ccitt | 31.9 | 25.2 |  2.5 |
|       md4 | 46.1 | 36.8 |  3.7 |
|       md5 | 45.8 | 36.4 |  3.6 |
|      sha1 | 46.9 | 38.0 |  3.8 |
|    sha256 | 47.0 | 37.6 |  3.8 |
+-----------+------+------+------+

For 4096-way ECMP with 0 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.4 | 24.9 |  2.5 |
|      mask | 31.5 | 24.9 |  2.5 |
|       xor | 31.2 | 24.9 |  2.5 |
| crc-ccitt | 31.7 | 25.2 |  2.5 |
|       md4 | 39.0 | 31.2 |  3.1 |
|       md5 | 39.8 | 31.9 |  3.2 |
|      sha1 | 39.1 | 31.1 |  3.1 |
|    sha256 | 39.2 | 31.2 |  3.1 |
+-----------+------+------+------+

For 2-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add | 269.0 | 269.0 | 26.9 |
|      mask |   3.0 |   3.0 |  0.3 |
|       xor |  94.0 |  94.0 |  9.4 |
| crc-ccitt |  94.0 |  94.0 |  9.4 |
|       md4 | 761.0 | 761.0 | 76.1 |
|       md5 | 381.0 | 381.0 | 38.1 |
|      sha1 | 104.0 | 104.0 | 10.4 |
|    sha256 | 771.0 | 771.0 | 77.1 |
+-----------+-------+-------+------+

For 4-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add | 153.0 | 131.5 | 13.2 |
|      mask |  34.5 |  27.0 |  2.7 |
|       xor | 161.6 | 161.0 | 16.1 |
| crc-ccitt |  36.9 |  31.0 |  3.1 |
|       md4 | 332.6 | 307.0 | 30.7 |
|       md5 | 562.9 | 443.5 | 44.4 |
|      sha1 | 219.2 | 184.0 | 18.4 |
|    sha256 | 358.9 | 325.0 | 32.5 |
+-----------+-------+-------+------+

For 8-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  74.6 |  67.2 |  6.7 |
|      mask |  17.3 |  15.8 |  1.6 |
|       xor |  76.0 |  75.5 |  7.5 |
| crc-ccitt | 167.8 | 166.5 | 16.6 |
|       md4 | 458.2 | 408.5 | 40.9 |
|       md5 | 340.7 | 247.8 | 24.8 |
|      sha1 | 487.6 | 382.2 | 38.2 |
|    sha256 | 355.5 | 282.5 | 28.2 |
+-----------+-------+-------+------+

For 16-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  46.0 |  35.0 |  3.5 |
|      mask |  30.1 |  27.2 |  2.7 |
|       xor |  48.3 |  43.9 |  4.4 |
| crc-ccitt |  24.4 |  19.9 |  2.0 |
|       md4 | 234.5 | 197.4 | 19.7 |
|       md5 | 262.5 | 196.1 | 19.6 |
|      sha1 | 183.4 | 150.0 | 15.0 |
|    sha256 | 281.1 | 251.2 | 25.1 |
+-----------+-------+-------+------+

For 32-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  35.9 |  28.9 |  2.9 |
|      mask |  31.2 |  26.1 |  2.6 |
|       xor |  32.6 |  26.8 |  2.7 |
| crc-ccitt |  40.0 |  32.5 |  3.3 |
|       md4 | 190.5 | 164.8 | 16.5 |
|       md5 | 194.2 | 152.2 | 15.2 |
|      sha1 | 188.4 | 155.7 | 15.6 |
|    sha256 | 145.6 | 121.2 | 12.1 |
+-----------+-------+-------+------+

For 64-way ECMP with 1 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  34.4 |  27.7 |  2.8 |
|      mask |  31.3 |  26.4 |  2.6 |
|       xor |  38.2 |  31.6 |  3.2 |
| crc-ccitt |  32.3 |  24.3 |  2.4 |
|       md4 | 127.3 |  96.7 |  9.7 |
|       md5 | 123.8 | 101.7 | 10.2 |
|      sha1 | 150.6 | 122.3 | 12.2 |
|    sha256 | 145.4 | 108.1 | 10.8 |
+-----------+-------+-------+------+

For 128-way ECMP with 1 more bits of entropy:
+-----------+-------+------+------+
|      Hash |  RMSE |  MAE | MAPE |
+-----------+-------+------+------+
|       add |  32.2 | 25.5 |  2.5 |
|      mask |  33.4 | 25.7 |  2.6 |
|       xor |  34.5 | 27.6 |  2.8 |
| crc-ccitt |  27.7 | 20.7 |  2.1 |
|       md4 |  94.6 | 77.5 |  7.7 |
|       md5 | 105.4 | 83.5 |  8.4 |
|      sha1 |  96.2 | 77.4 |  7.7 |
|    sha256 | 100.2 | 75.9 |  7.6 |
+-----------+-------+------+------+

For 256-way ECMP with 1 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.0 | 24.9 |  2.5 |
|      mask | 30.8 | 25.1 |  2.5 |
|       xor | 28.7 | 22.5 |  2.3 |
| crc-ccitt | 33.8 | 27.6 |  2.8 |
|       md4 | 72.6 | 59.9 |  6.0 |
|       md5 | 69.4 | 55.5 |  5.5 |
|      sha1 | 72.8 | 58.6 |  5.9 |
|    sha256 | 72.7 | 56.7 |  5.7 |
+-----------+------+------+------+

For 512-way ECMP with 1 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.7 | 25.4 |  2.5 |
|      mask | 29.7 | 23.5 |  2.3 |
|       xor | 31.9 | 25.4 |  2.5 |
| crc-ccitt | 30.9 | 24.7 |  2.5 |
|       md4 | 53.8 | 43.2 |  4.3 |
|       md5 | 57.3 | 46.7 |  4.7 |
|      sha1 | 59.7 | 47.2 |  4.7 |
|    sha256 | 56.2 | 45.4 |  4.5 |
+-----------+------+------+------+

For 1024-way ECMP with 1 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.6 | 25.1 |  2.5 |
|      mask | 31.0 | 25.0 |  2.5 |
|       xor | 31.5 | 25.1 |  2.5 |
| crc-ccitt | 30.2 | 24.1 |  2.4 |
|       md4 | 45.0 | 35.4 |  3.5 |
|       md5 | 47.6 | 38.0 |  3.8 |
|      sha1 | 45.7 | 36.7 |  3.7 |
|    sha256 | 46.5 | 36.8 |  3.7 |
+-----------+------+------+------+

For 2048-way ECMP with 1 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.7 | 26.0 |  2.6 |
|      mask | 31.9 | 25.5 |  2.6 |
|       xor | 31.8 | 25.4 |  2.5 |
| crc-ccitt | 32.4 | 25.8 |  2.6 |
|       md4 | 39.5 | 31.8 |  3.2 |
|       md5 | 38.6 | 30.8 |  3.1 |
|      sha1 | 39.3 | 31.1 |  3.1 |
|    sha256 | 39.7 | 31.9 |  3.2 |
+-----------+------+------+------+

For 4096-way ECMP with 1 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.7 | 25.3 |  2.5 |
|      mask | 31.5 | 25.1 |  2.5 |
|       xor | 31.8 | 25.5 |  2.6 |
| crc-ccitt | 32.3 | 25.9 |  2.6 |
|       md4 | 35.9 | 28.5 |  2.9 |
|       md5 | 35.7 | 28.5 |  2.9 |
|      sha1 | 35.2 | 28.1 |  2.8 |
|    sha256 | 36.3 | 28.9 |  2.9 |
+-----------+------+------+------+

For 2-way ECMP with 2 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |   2.0 |   2.0 |  0.2 |
|      mask |  15.0 |  15.0 |  1.5 |
|       xor |  44.0 |  44.0 |  4.4 |
| crc-ccitt |  44.0 |  44.0 |  4.4 |
|       md4 | 197.0 | 197.0 | 19.7 |
|       md5 | 123.0 | 123.0 | 12.3 |
|      sha1 | 238.0 | 238.0 | 23.8 |
|    sha256 |  20.0 |  20.0 |  2.0 |
+-----------+-------+-------+------+

For 4-way ECMP with 2 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  14.1 |  12.5 |  1.2 |
|      mask |   8.2 |   8.0 |  0.8 |
|       xor |   9.5 |   7.5 |  0.8 |
| crc-ccitt |  66.0 |  57.5 |  5.8 |
|       md4 | 119.6 |  94.5 |  9.4 |
|       md5 | 553.7 | 472.0 | 47.2 |
|      sha1 | 163.8 | 134.5 | 13.5 |
|    sha256 | 366.7 | 298.5 | 29.8 |
+-----------+-------+-------+------+

For 8-way ECMP with 2 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  30.2 |  22.5 |  2.2 |
|      mask |  24.0 |  19.8 |  2.0 |
|       xor |  43.9 |  36.5 |  3.7 |
| crc-ccitt |  25.8 |  22.2 |  2.2 |
|       md4 | 245.6 | 163.5 | 16.3 |
|       md5 | 233.6 | 187.2 | 18.7 |
|      sha1 | 337.1 | 295.8 | 29.6 |
|    sha256 | 247.0 | 194.2 | 19.4 |
+-----------+-------+-------+------+

For 16-way ECMP with 2 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  23.0 |  19.0 |  1.9 |
|      mask |  33.5 |  27.9 |  2.8 |
|       xor |  26.4 |  21.5 |  2.2 |
| crc-ccitt |  26.1 |  22.4 |  2.2 |
|       md4 | 212.4 | 151.2 | 15.1 |
|       md5 | 227.4 | 174.5 | 17.5 |
|      sha1 | 180.4 | 146.9 | 14.7 |
|    sha256 | 193.3 | 155.8 | 15.6 |
+-----------+-------+-------+------+

For 32-way ECMP with 2 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  35.4 |  28.9 |  2.9 |
|      mask |  26.6 |  22.8 |  2.3 |
|       xor |  30.8 |  23.7 |  2.4 |
| crc-ccitt |  30.4 |  23.6 |  2.4 |
|       md4 | 131.6 | 107.1 | 10.7 |
|       md5 | 136.4 | 104.9 | 10.5 |
|      sha1 | 121.8 | 101.3 | 10.1 |
|    sha256 | 137.0 | 112.8 | 11.3 |
+-----------+-------+-------+------+

For 64-way ECMP with 2 more bits of entropy:
+-----------+-------+------+------+
|      Hash |  RMSE |  MAE | MAPE |
+-----------+-------+------+------+
|       add |  30.6 | 24.7 |  2.5 |
|      mask |  28.6 | 21.5 |  2.1 |
|       xor |  35.1 | 28.8 |  2.9 |
| crc-ccitt |  37.4 | 30.3 |  3.0 |
|       md4 |  95.3 | 80.0 |  8.0 |
|       md5 | 110.5 | 89.8 |  9.0 |
|      sha1 | 106.2 | 85.4 |  8.5 |
|    sha256 | 104.7 | 84.9 |  8.5 |
+-----------+-------+------+------+

For 128-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 30.5 | 24.5 |  2.4 |
|      mask | 33.6 | 27.0 |  2.7 |
|       xor | 31.1 | 25.5 |  2.6 |
| crc-ccitt | 31.7 | 25.4 |  2.5 |
|       md4 | 69.0 | 55.2 |  5.5 |
|       md5 | 72.6 | 55.3 |  5.5 |
|      sha1 | 76.9 | 60.5 |  6.1 |
|    sha256 | 75.9 | 59.8 |  6.0 |
+-----------+------+------+------+

For 256-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 30.3 | 23.9 |  2.4 |
|      mask | 32.6 | 26.2 |  2.6 |
|       xor | 28.9 | 23.1 |  2.3 |
| crc-ccitt | 35.2 | 28.0 |  2.8 |
|       md4 | 59.0 | 46.5 |  4.6 |
|       md5 | 54.7 | 44.0 |  4.4 |
|      sha1 | 56.8 | 44.3 |  4.4 |
|    sha256 | 54.5 | 44.1 |  4.4 |
+-----------+------+------+------+

For 512-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.2 | 25.4 |  2.5 |
|      mask | 32.4 | 25.8 |  2.6 |
|       xor | 31.8 | 25.1 |  2.5 |
| crc-ccitt | 33.2 | 26.6 |  2.7 |
|       md4 | 47.0 | 36.5 |  3.7 |
|       md5 | 45.4 | 36.5 |  3.6 |
|      sha1 | 44.1 | 35.6 |  3.6 |
|    sha256 | 45.7 | 36.5 |  3.6 |
+-----------+------+------+------+

For 1024-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.2 | 25.2 |  2.5 |
|      mask | 30.8 | 24.5 |  2.5 |
|       xor | 31.6 | 24.8 |  2.5 |
| crc-ccitt | 31.9 | 25.5 |  2.5 |
|       md4 | 39.5 | 31.4 |  3.1 |
|       md5 | 39.4 | 31.8 |  3.2 |
|      sha1 | 39.3 | 31.4 |  3.1 |
|    sha256 | 38.6 | 31.0 |  3.1 |
+-----------+------+------+------+

For 2048-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.5 | 25.1 |  2.5 |
|      mask | 32.4 | 25.6 |  2.6 |
|       xor | 32.7 | 26.0 |  2.6 |
| crc-ccitt | 32.1 | 25.5 |  2.6 |
|       md4 | 36.4 | 29.1 |  2.9 |
|       md5 | 35.8 | 28.6 |  2.9 |
|      sha1 | 34.9 | 27.6 |  2.8 |
|    sha256 | 35.3 | 27.9 |  2.8 |
+-----------+------+------+------+

For 4096-way ECMP with 2 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.9 | 25.4 |  2.5 |
|      mask | 31.2 | 24.9 |  2.5 |
|       xor | 32.1 | 25.8 |  2.6 |
| crc-ccitt | 31.4 | 25.0 |  2.5 |
|       md4 | 33.3 | 26.7 |  2.7 |
|       md5 | 33.8 | 27.0 |  2.7 |
|      sha1 | 34.0 | 27.1 |  2.7 |
|    sha256 | 34.3 | 27.2 |  2.7 |
+-----------+------+------+------+

For 2-way ECMP with 3 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  10.0 |  10.0 |  1.0 |
|      mask |   0.0 |   0.0 |  0.0 |
|       xor |   1.0 |   1.0 |  0.1 |
| crc-ccitt |   1.0 |   1.0 |  0.1 |
|       md4 |  28.0 |  28.0 |  2.8 |
|       md5 | 372.0 | 372.0 | 37.2 |
|      sha1 |  36.0 |  36.0 |  3.6 |
|    sha256 |  99.0 |  99.0 |  9.9 |
+-----------+-------+-------+------+

For 4-way ECMP with 3 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  16.4 |  13.5 |  1.3 |
|      mask |  26.5 |  21.5 |  2.1 |
|       xor |  25.8 |  22.5 |  2.2 |
| crc-ccitt |  24.4 |  21.0 |  2.1 |
|       md4 | 411.4 | 408.5 | 40.8 |
|       md5 | 191.2 | 163.0 | 16.3 |
|      sha1 |  88.6 |  72.0 |  7.2 |
|    sha256 | 177.6 | 152.5 | 15.2 |
+-----------+-------+-------+------+

For 8-way ECMP with 3 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  29.4 |  27.0 |  2.7 |
|      mask |  34.4 |  30.0 |  3.0 |
|       xor |  38.2 |  25.5 |  2.5 |
| crc-ccitt |  35.2 |  32.0 |  3.2 |
|       md4 | 133.3 | 115.2 | 11.5 |
|       md5 | 257.9 | 179.2 | 17.9 |
|      sha1 | 139.7 | 109.5 | 10.9 |
|    sha256 | 120.1 | 108.8 | 10.9 |
+-----------+-------+-------+------+

For 16-way ECMP with 3 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  29.5 |  22.5 |  2.3 |
|      mask |  21.8 |  17.5 |  1.8 |
|       xor |  29.8 |  26.1 |  2.6 |
| crc-ccitt |  23.4 |  18.9 |  1.9 |
|       md4 | 116.8 |  83.8 |  8.4 |
|       md5 | 156.1 | 130.5 | 13.1 |
|      sha1 | 144.3 | 116.9 | 11.7 |
|    sha256 | 138.1 | 113.6 | 11.4 |
+-----------+-------+-------+------+

For 32-way ECMP with 3 more bits of entropy:
+-----------+-------+------+------+
|      Hash |  RMSE |  MAE | MAPE |
+-----------+-------+------+------+
|       add |  27.9 | 22.9 |  2.3 |
|      mask |  33.4 | 23.9 |  2.4 |
|       xor |  27.4 | 22.1 |  2.2 |
| crc-ccitt |  27.6 | 21.4 |  2.1 |
|       md4 |  90.3 | 70.6 |  7.1 |
|       md5 |  75.9 | 60.9 |  6.1 |
|      sha1 |  96.7 | 76.5 |  7.7 |
|    sha256 | 116.8 | 96.2 |  9.6 |
+-----------+-------+------+------+

For 64-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.0 | 25.9 |  2.6 |
|      mask | 27.7 | 22.1 |  2.2 |
|       xor | 32.2 | 26.0 |  2.6 |
| crc-ccitt | 32.1 | 25.1 |  2.5 |
|       md4 | 64.5 | 51.1 |  5.1 |
|       md5 | 76.9 | 60.4 |  6.0 |
|      sha1 | 77.1 | 62.1 |  6.2 |
|    sha256 | 78.3 | 62.7 |  6.3 |
+-----------+------+------+------+

For 128-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 29.4 | 24.2 |  2.4 |
|      mask | 32.1 | 25.5 |  2.5 |
|       xor | 30.7 | 24.7 |  2.5 |
| crc-ccitt | 33.8 | 26.7 |  2.7 |
|       md4 | 52.7 | 42.8 |  4.3 |
|       md5 | 55.5 | 45.0 |  4.5 |
|      sha1 | 60.3 | 48.5 |  4.8 |
|    sha256 | 57.0 | 46.2 |  4.6 |
+-----------+------+------+------+

For 256-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.2 | 25.5 |  2.5 |
|      mask | 30.3 | 24.3 |  2.4 |
|       xor | 32.6 | 26.4 |  2.6 |
| crc-ccitt | 31.4 | 25.7 |  2.6 |
|       md4 | 50.2 | 39.8 |  4.0 |
|       md5 | 44.2 | 34.9 |  3.5 |
|      sha1 | 46.7 | 37.0 |  3.7 |
|    sha256 | 46.9 | 36.5 |  3.6 |
+-----------+------+------+------+

For 512-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.8 | 25.4 |  2.5 |
|      mask | 31.7 | 25.5 |  2.5 |
|       xor | 31.5 | 25.2 |  2.5 |
| crc-ccitt | 32.1 | 25.5 |  2.6 |
|       md4 | 39.8 | 32.2 |  3.2 |
|       md5 | 38.7 | 30.8 |  3.1 |
|      sha1 | 38.6 | 31.4 |  3.1 |
|    sha256 | 39.9 | 31.2 |  3.1 |
+-----------+------+------+------+

For 1024-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 33.1 | 26.5 |  2.6 |
|      mask | 32.7 | 26.3 |  2.6 |
|       xor | 31.5 | 25.1 |  2.5 |
| crc-ccitt | 31.9 | 25.5 |  2.5 |
|       md4 | 35.5 | 28.1 |  2.8 |
|       md5 | 36.9 | 29.2 |  2.9 |
|      sha1 | 35.7 | 28.6 |  2.9 |
|    sha256 | 35.8 | 28.5 |  2.8 |
+-----------+------+------+------+

For 2048-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.3 | 24.9 |  2.5 |
|      mask | 31.5 | 24.9 |  2.5 |
|       xor | 32.3 | 25.7 |  2.6 |
| crc-ccitt | 30.9 | 24.4 |  2.4 |
|       md4 | 33.7 | 26.6 |  2.7 |
|       md5 | 33.8 | 27.3 |  2.7 |
|      sha1 | 32.6 | 26.4 |  2.6 |
|    sha256 | 33.5 | 26.6 |  2.7 |
+-----------+------+------+------+

For 4096-way ECMP with 3 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.2 | 25.5 |  2.5 |
|      mask | 31.3 | 25.1 |  2.5 |
|       xor | 31.8 | 25.2 |  2.5 |
| crc-ccitt | 31.7 | 25.1 |  2.5 |
|       md4 | 33.3 | 26.4 |  2.6 |
|       md5 | 32.8 | 26.2 |  2.6 |
|      sha1 | 32.9 | 26.3 |  2.6 |
|    sha256 | 32.8 | 26.2 |  2.6 |
+-----------+------+------+------+

For 2-way ECMP with 4 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  24.0 |  24.0 |  2.4 |
|      mask |   5.0 |   5.0 |  0.5 |
|       xor |  26.0 |  26.0 |  2.6 |
| crc-ccitt |  26.0 |  26.0 |  2.6 |
|       md4 |  46.0 |  46.0 |  4.6 |
|       md5 | 250.0 | 250.0 | 25.0 |
|      sha1 |  75.0 |  75.0 |  7.5 |
|    sha256 | 262.0 | 262.0 | 26.2 |
+-----------+-------+-------+------+

For 4-way ECMP with 4 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  39.3 |  32.0 |  3.2 |
|      mask |  17.7 |  13.5 |  1.4 |
|       xor |  28.4 |  22.5 |  2.2 |
| crc-ccitt |  29.5 |  22.0 |  2.2 |
|       md4 | 180.0 | 151.5 | 15.2 |
|       md5 | 148.5 | 130.0 | 13.0 |
|      sha1 | 116.0 | 100.0 | 10.0 |
|    sha256 | 128.4 | 113.5 | 11.3 |
+-----------+-------+-------+------+

For 8-way ECMP with 4 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  32.7 |  27.0 |  2.7 |
|      mask |  32.7 |  25.2 |  2.5 |
|       xor |  37.7 |  26.2 |  2.6 |
| crc-ccitt |  30.3 |  23.2 |  2.3 |
|       md4 |  79.2 |  68.5 |  6.9 |
|       md5 | 148.2 | 133.0 | 13.3 |
|      sha1 | 112.1 | 101.8 | 10.2 |
|    sha256 | 120.7 | 108.8 | 10.9 |
+-----------+-------+-------+------+

For 16-way ECMP with 4 more bits of entropy:
+-----------+-------+------+------+
|      Hash |  RMSE |  MAE | MAPE |
+-----------+-------+------+------+
|       add |  26.7 | 21.0 |  2.1 |
|      mask |  42.9 | 34.9 |  3.5 |
|       xor |  31.5 | 24.0 |  2.4 |
| crc-ccitt |  33.9 | 29.1 |  2.9 |
|       md4 | 120.1 | 94.6 |  9.5 |
|       md5 | 106.8 | 86.4 |  8.6 |
|      sha1 |  90.1 | 71.1 |  7.1 |
|    sha256 |  65.7 | 58.9 |  5.9 |
+-----------+-------+------+------+

For 32-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 33.2 | 25.9 |  2.6 |
|      mask | 30.3 | 24.7 |  2.5 |
|       xor | 38.8 | 32.2 |  3.2 |
| crc-ccitt | 28.0 | 21.9 |  2.2 |
|       md4 | 63.9 | 48.1 |  4.8 |
|       md5 | 79.4 | 61.7 |  6.2 |
|      sha1 | 63.1 | 49.9 |  5.0 |
|    sha256 | 83.0 | 69.1 |  6.9 |
+-----------+------+------+------+

For 64-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 28.7 | 22.3 |  2.2 |
|      mask | 30.2 | 25.5 |  2.6 |
|       xor | 33.2 | 26.8 |  2.7 |
| crc-ccitt | 30.2 | 23.3 |  2.3 |
|       md4 | 52.5 | 42.5 |  4.2 |
|       md5 | 62.2 | 51.2 |  5.1 |
|      sha1 | 55.1 | 45.0 |  4.5 |
|    sha256 | 52.0 | 42.3 |  4.2 |
+-----------+------+------+------+

For 128-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.6 | 25.0 |  2.5 |
|      mask | 29.0 | 21.8 |  2.2 |
|       xor | 30.1 | 23.0 |  2.3 |
| crc-ccitt | 29.7 | 24.4 |  2.4 |
|       md4 | 46.5 | 36.9 |  3.7 |
|       md5 | 46.1 | 36.6 |  3.7 |
|      sha1 | 42.9 | 33.8 |  3.4 |
|    sha256 | 50.0 | 40.4 |  4.0 |
+-----------+------+------+------+

For 256-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.3 | 24.9 |  2.5 |
|      mask | 30.5 | 23.8 |  2.4 |
|       xor | 31.0 | 25.4 |  2.5 |
| crc-ccitt | 32.7 | 26.1 |  2.6 |
|       md4 | 40.8 | 32.7 |  3.3 |
|       md5 | 41.5 | 33.0 |  3.3 |
|      sha1 | 36.4 | 28.5 |  2.8 |
|    sha256 | 38.4 | 30.1 |  3.0 |
+-----------+------+------+------+

For 512-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.4 | 25.3 |  2.5 |
|      mask | 32.5 | 26.0 |  2.6 |
|       xor | 31.5 | 24.7 |  2.5 |
| crc-ccitt | 31.6 | 25.1 |  2.5 |
|       md4 | 34.3 | 27.3 |  2.7 |
|       md5 | 36.1 | 29.2 |  2.9 |
|      sha1 | 35.9 | 28.6 |  2.9 |
|    sha256 | 37.1 | 29.5 |  2.9 |
+-----------+------+------+------+

For 1024-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.3 | 24.8 |  2.5 |
|      mask | 31.7 | 25.2 |  2.5 |
|       xor | 31.4 | 25.1 |  2.5 |
| crc-ccitt | 31.5 | 25.3 |  2.5 |
|       md4 | 33.1 | 26.3 |  2.6 |
|       md5 | 34.1 | 27.0 |  2.7 |
|      sha1 | 33.7 | 27.1 |  2.7 |
|    sha256 | 32.8 | 26.1 |  2.6 |
+-----------+------+------+------+

For 2048-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.9 | 25.4 |  2.5 |
|      mask | 31.8 | 25.5 |  2.5 |
|       xor | 32.2 | 25.7 |  2.6 |
| crc-ccitt | 31.4 | 24.8 |  2.5 |
|       md4 | 32.7 | 26.1 |  2.6 |
|       md5 | 32.9 | 26.1 |  2.6 |
|      sha1 | 33.0 | 26.3 |  2.6 |
|    sha256 | 31.9 | 25.7 |  2.6 |
+-----------+------+------+------+

For 4096-way ECMP with 4 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.7 | 25.4 |  2.5 |
|      mask | 32.5 | 25.8 |  2.6 |
|       xor | 31.7 | 25.2 |  2.5 |
| crc-ccitt | 32.0 | 25.7 |  2.6 |
|       md4 | 32.6 | 26.0 |  2.6 |
|       md5 | 31.6 | 25.1 |  2.5 |
|      sha1 | 31.7 | 25.1 |  2.5 |
|    sha256 | 32.3 | 25.9 |  2.6 |
+-----------+------+------+------+

For 2-way ECMP with 5 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  29.0 |  29.0 |  2.9 |
|      mask |  11.0 |  11.0 |  1.1 |
|       xor |   7.0 |   7.0 |  0.7 |
| crc-ccitt |   7.0 |   7.0 |  0.7 |
|       md4 | 358.0 | 358.0 | 35.8 |
|       md5 | 174.0 | 174.0 | 17.4 |
|      sha1 | 108.0 | 108.0 | 10.8 |
|    sha256 |  10.0 |  10.0 |  1.0 |
+-----------+-------+-------+------+

For 4-way ECMP with 5 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  41.3 |  35.0 |  3.5 |
|      mask |  42.7 |  33.5 |  3.4 |
|       xor |  17.5 |  15.5 |  1.6 |
| crc-ccitt |  14.2 |  12.5 |  1.2 |
|       md4 | 135.3 | 125.0 | 12.5 |
|       md5 | 128.0 | 109.0 | 10.9 |
|      sha1 | 114.3 | 106.5 | 10.7 |
|    sha256 | 175.5 | 141.5 | 14.2 |
+-----------+-------+-------+------+

For 8-way ECMP with 5 more bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|       add |  23.5 |  20.0 |  2.0 |
|      mask |  29.0 |  20.2 |  2.0 |
|       xor |  27.1 |  24.5 |  2.4 |
| crc-ccitt |  27.6 |  20.2 |  2.0 |
|       md4 | 105.4 |  91.5 |  9.2 |
|       md5 |  53.3 |  43.5 |  4.3 |
|      sha1 |  74.8 |  63.8 |  6.4 |
|    sha256 | 124.7 | 102.2 | 10.2 |
+-----------+-------+-------+------+

For 16-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 39.1 | 33.2 |  3.3 |
|      mask | 38.5 | 29.5 |  2.9 |
|       xor | 41.3 | 33.6 |  3.4 |
| crc-ccitt | 27.0 | 21.2 |  2.1 |
|       md4 | 71.6 | 59.1 |  5.9 |
|       md5 | 86.5 | 73.8 |  7.4 |
|      sha1 | 79.3 | 63.4 |  6.3 |
|    sha256 | 59.3 | 50.9 |  5.1 |
+-----------+------+------+------+

For 32-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.2 | 25.1 |  2.5 |
|      mask | 33.7 | 28.6 |  2.9 |
|       xor | 32.6 | 27.6 |  2.8 |
| crc-ccitt | 28.7 | 22.0 |  2.2 |
|       md4 | 51.4 | 42.0 |  4.2 |
|       md5 | 54.2 | 44.8 |  4.5 |
|      sha1 | 68.5 | 49.2 |  4.9 |
|    sha256 | 56.7 | 47.8 |  4.8 |
+-----------+------+------+------+

For 64-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 33.0 | 26.6 |  2.7 |
|      mask | 29.4 | 22.9 |  2.3 |
|       xor | 33.9 | 27.1 |  2.7 |
| crc-ccitt | 29.6 | 22.0 |  2.2 |
|       md4 | 46.6 | 35.8 |  3.6 |
|       md5 | 48.5 | 39.8 |  4.0 |
|      sha1 | 43.4 | 33.8 |  3.4 |
|    sha256 | 44.4 | 36.2 |  3.6 |
+-----------+------+------+------+

For 128-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.3 | 25.7 |  2.6 |
|      mask | 28.8 | 22.9 |  2.3 |
|       xor | 30.0 | 24.5 |  2.5 |
| crc-ccitt | 31.3 | 23.9 |  2.4 |
|       md4 | 41.7 | 34.7 |  3.5 |
|       md5 | 38.5 | 31.1 |  3.1 |
|      sha1 | 36.4 | 28.8 |  2.9 |
|    sha256 | 35.0 | 28.0 |  2.8 |
+-----------+------+------+------+

For 256-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 30.8 | 24.4 |  2.4 |
|      mask | 31.0 | 24.6 |  2.5 |
|       xor | 31.3 | 24.7 |  2.5 |
| crc-ccitt | 31.1 | 24.3 |  2.4 |
|       md4 | 37.0 | 29.6 |  3.0 |
|       md5 | 31.5 | 26.0 |  2.6 |
|      sha1 | 35.5 | 27.7 |  2.8 |
|    sha256 | 37.0 | 29.6 |  3.0 |
+-----------+------+------+------+

For 512-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.0 | 25.2 |  2.5 |
|      mask | 30.9 | 24.7 |  2.5 |
|       xor | 30.3 | 24.3 |  2.4 |
| crc-ccitt | 31.6 | 25.0 |  2.5 |
|       md4 | 36.0 | 28.6 |  2.9 |
|       md5 | 33.9 | 26.5 |  2.6 |
|      sha1 | 32.7 | 25.9 |  2.6 |
|    sha256 | 33.7 | 26.5 |  2.6 |
+-----------+------+------+------+

For 1024-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 32.5 | 25.7 |  2.6 |
|      mask | 32.1 | 25.7 |  2.6 |
|       xor | 32.4 | 26.1 |  2.6 |
| crc-ccitt | 31.2 | 25.5 |  2.5 |
|       md4 | 33.4 | 26.8 |  2.7 |
|       md5 | 32.2 | 25.9 |  2.6 |
|      sha1 | 33.4 | 26.3 |  2.6 |
|    sha256 | 33.3 | 26.5 |  2.7 |
+-----------+------+------+------+

For 2048-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 30.9 | 24.8 |  2.5 |
|      mask | 32.1 | 25.9 |  2.6 |
|       xor | 31.9 | 25.5 |  2.5 |
| crc-ccitt | 31.3 | 24.9 |  2.5 |
|       md4 | 32.3 | 25.8 |  2.6 |
|       md5 | 32.4 | 25.9 |  2.6 |
|      sha1 | 32.6 | 26.1 |  2.6 |
|    sha256 | 32.6 | 25.9 |  2.6 |
+-----------+------+------+------+

For 4096-way ECMP with 5 more bits of entropy:
+-----------+------+------+------+
|      Hash | RMSE |  MAE | MAPE |
+-----------+------+------+------+
|       add | 31.8 | 25.2 |  2.5 |
|      mask | 31.5 | 24.9 |  2.5 |
|       xor | 31.6 | 25.1 |  2.5 |
| crc-ccitt | 31.6 | 25.3 |  2.5 |
|       md4 | 31.9 | 25.5 |  2.6 |
|       md5 | 31.8 | 25.2 |  2.5 |
|      sha1 | 32.2 | 25.7 |  2.6 |
|    sha256 | 32.2 | 26.0 |  2.6 |
+-----------+------+------+------+

Error per added bit
+------------+-------+-------+-------+
| Added bits | MRMSE |  MMAE | MMAPE |
+------------+-------+-------+-------+
|          0 | 171.0 | 150.6 |  15.1 |
|          1 | 115.8 | 100.2 |  10.0 |
|          2 |  74.9 |  61.6 |   6.2 |
|          3 |  58.5 |  49.0 |   4.9 |
|          4 |  51.1 |  43.2 |   4.3 |
|          5 |  47.1 |  39.8 |   4.0 |
+------------+-------+-------+-------+

Error per algorithm
+-----------+-------+-------+-------+
| Algorithm | MRMSE |  MMAE | MMAPE |
+-----------+-------+-------+-------+
|       add |  52.7 |  45.8 |   4.6 |
|      mask |  34.1 |  28.6 |   2.9 |
|       xor |  54.0 |  48.0 |   4.8 |
| crc-ccitt |  48.7 |  43.2 |   4.3 |
|       md4 | 137.7 | 119.8 |  12.0 |
|       md5 | 131.3 | 110.7 |  11.1 |
|      sha1 | 110.5 |  93.0 |   9.3 |
|    sha256 | 122.2 | 103.3 |  10.3 |
+-----------+-------+-------+-------+

For 3597-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.7 |  25.2 |  2.5 |
| crc-ccitt | 264.8 | 210.5 | 21.0 |
|       md4 | 356.1 | 283.5 | 28.3 |
|       md5 | 357.9 | 286.4 | 28.6 |
|      sha1 | 358.9 | 284.9 | 28.5 |
|    sha256 | 357.1 | 283.1 | 28.3 |
+-----------+-------+-------+------+

For 911-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.5 |  25.4 |  2.5 |
| crc-ccitt | 163.2 | 133.3 | 13.3 |
|       md4 | 181.9 | 144.9 | 14.5 |
|       md5 | 190.0 | 150.5 | 15.0 |
|      sha1 | 181.6 | 147.2 | 14.7 |
|    sha256 | 180.3 | 143.8 | 14.4 |
+-----------+-------+-------+------+

For 3023-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.8 |  25.6 |  2.6 |
| crc-ccitt | 238.2 | 191.1 | 19.1 |
|       md4 | 320.7 | 254.9 | 25.5 |
|       md5 | 319.7 | 253.8 | 25.4 |
|      sha1 | 329.1 | 262.8 | 26.3 |
|    sha256 | 328.0 | 261.6 | 26.2 |
+-----------+-------+-------+------+

For 2288-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.5 |  25.2 |  2.5 |
| crc-ccitt | 190.8 | 156.0 | 15.6 |
|       md4 | 282.4 | 225.8 | 22.6 |
|       md5 | 279.8 | 220.4 | 22.0 |
|      sha1 | 280.8 | 225.2 | 22.5 |
|    sha256 | 281.9 | 223.5 | 22.3 |
+-----------+-------+-------+------+

For 2761-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  32.1 |  25.4 |  2.5 |
| crc-ccitt | 225.4 | 179.9 | 18.0 |
|       md4 | 318.4 | 253.0 | 25.3 |
|       md5 | 309.4 | 247.8 | 24.8 |
|      sha1 | 304.6 | 244.0 | 24.4 |
|    sha256 | 309.2 | 247.2 | 24.7 |
+-----------+-------+-------+------+

For 1845-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.4 |  25.0 |  2.5 |
| crc-ccitt | 161.2 | 129.6 | 13.0 |
|       md4 | 260.3 | 207.3 | 20.7 |
|       md5 | 257.3 | 203.1 | 20.3 |
|      sha1 | 259.9 | 206.1 | 20.6 |
|    sha256 | 245.7 | 196.3 | 19.6 |
+-----------+-------+-------+------+

For 3508-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.4 |  25.2 |  2.5 |
| crc-ccitt | 209.0 | 167.7 | 16.8 |
|       md4 | 352.0 | 280.6 | 28.1 |
|       md5 | 346.1 | 277.6 | 27.8 |
|      sha1 | 357.4 | 284.2 | 28.4 |
|    sha256 | 344.9 | 274.3 | 27.4 |
+-----------+-------+-------+------+

For 1963-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.4 |  25.3 |  2.5 |
| crc-ccitt | 163.5 | 131.9 | 13.2 |
|       md4 | 257.7 | 205.5 | 20.6 |
|       md5 | 257.2 | 204.8 | 20.5 |
|      sha1 | 264.4 | 213.0 | 21.3 |
|    sha256 | 266.7 | 214.1 | 21.4 |
+-----------+-------+-------+------+

For 1168-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  32.2 |  25.4 |  2.5 |
| crc-ccitt | 107.5 |  86.1 |  8.6 |
|       md4 | 198.6 | 158.4 | 15.8 |
|       md5 | 203.3 | 161.8 | 16.2 |
|      sha1 | 201.1 | 162.3 | 16.2 |
|    sha256 | 201.4 | 159.0 | 15.9 |
+-----------+-------+-------+------+

For 2274-way ECMP, 16 bits of entropy:
+-----------+-------+-------+------+
|      Hash |  RMSE |   MAE | MAPE |
+-----------+-------+-------+------+
|      mask |  31.7 |  25.0 |  2.5 |
| crc-ccitt | 208.9 | 166.0 | 16.6 |
|       md4 | 277.2 | 221.8 | 22.2 |
|       md5 | 279.8 | 224.9 | 22.5 |
|      sha1 | 285.5 | 225.7 | 22.6 |
|    sha256 | 288.4 | 229.6 | 23.0 |
+-----------+-------+-------+------+

For n-way ECMP, with 16 bits of entropy, across hash functions
+--------+-------+-------+-------+
| n-ways | MRMSE |  MMAE | MMAPE |
+--------+-------+-------+-------+
|   3597 | 287.8 | 228.9 |  22.9 |
|    911 | 154.8 | 124.2 |  12.4 |
|   3023 | 261.2 | 208.3 |  20.8 |
|   2288 | 224.5 | 179.3 |  17.9 |
|   2761 | 249.9 | 199.5 |  19.9 |
|   1845 | 202.6 | 161.2 |  16.1 |
|   3508 | 273.5 | 218.3 |  21.8 |
|   1963 | 206.8 | 165.8 |  16.6 |
|   1168 | 157.3 | 125.5 |  12.5 |
|   2274 | 228.6 | 182.2 |  18.2 |
+--------+-------+-------+-------+
]]></artwork></figure>

</section>


  </back>

<!-- ##markdown-source:
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
CGsYgF/sH+//AcEuL1su/AAA

-->

</rfc>

