Internet-Draft | Entropy Values | May 2022 |
Li | Expires 5 November 2022 | [Page] |
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.¶
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. [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. [I-D.bocci-mpls-miad-adi-requirements][I-D.andersson-mpls-mna-fwk]¶
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.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 5 November 2022.¶
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
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.¶
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. [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. [I-D.bocci-mpls-miad-adi-requirements][I-D.andersson-mpls-mna-fwk]¶
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.¶
In a typical ECMP situation, a Label Edge Router (LER) [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.¶
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) [RFC3032]. We generalize this to an Entropy Value (EV) and seek to understand the necessary size of this field.¶
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.¶
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.¶
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.¶
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.¶
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.¶
Thus, we consider a number of hashing functions:¶
Some of these hash functions work better than others. Additional hash functions could easily be added.¶
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.¶
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.¶
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.¶
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.¶
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.¶
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:¶
We then summarize the results based on the number of additional bits and on algorithm, computing the mean of each of the above metrics.¶
The arguments in Section 4 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.¶
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.¶
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.¶
We observe that for some entropy values, we get unacceptable solutions across all algorithms:¶
For 2-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 653.0 | 653.0 | 65.3 | | mask | 374.0 | 374.0 | 37.4 | | xor | 653.0 | 653.0 | 65.3 | | crc-ccitt | 653.0 | 653.0 | 65.3 | | md4 | 653.0 | 653.0 | 65.3 | | md5 | 371.0 | 371.0 | 37.1 | | sha1 | 374.0 | 374.0 | 37.4 | | sha256 | 374.0 | 374.0 | 37.4 | +-----------+-------+-------+------+¶
Clearly, a 2 bit entropy value is not acceptable.¶
We also observe that some algorithms perform better than others: ~~~ For 16-way ECMP with 1 more bits of entropy: +-------+-----+-----+----+ | Hash | RMSE | MAE | MAPE | +-------+-----+-----+----+ | add | 39.2 | 33.6 | 3.4 | | mask | 30.2 | 25.2 | 2.5 | | xor | 39.2 | 32.6 | 3.3 | | crc-ccitt | 27.9 | 22.8 | 2.3 | | md4 | 226.6 | 190.1 | 19.0 | | md5 | 255.0 | 194.4 | 19.4 | | sha1 | 194.6 | 164.1 | 16.4 | | sha256 | 252.1 | 226.4 | 22.6 | +-------+-----+-----+----+ ~~~¶
Understanding why some algorithms perform poorly is not understood at this time and a subject for future research.¶
Once we reach about 10 bits of entropy value, most algorithms work well, most of the time:¶
For 1024-way ECMP with 0 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.2 | 25.7 | 2.6 | | mask | 31.4 | 25.2 | 2.5 | | xor | 32.0 | 25.2 | 2.5 | | crc-ccitt | 31.3 | 24.9 | 2.5 | | md4 | 54.4 | 43.7 | 4.4 | | md5 | 54.9 | 43.2 | 4.3 | | sha1 | 57.1 | 44.8 | 4.5 | | sha256 | 56.5 | 45.5 | 4.5 | +-----------+------+------+------+ For 256-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 33.2 | 25.5 | 2.5 | | mask | 29.7 | 23.6 | 2.4 | | xor | 31.4 | 25.4 | 2.5 | | crc-ccitt | 30.3 | 23.7 | 2.4 | | md4 | 56.3 | 44.5 | 4.4 | | md5 | 54.7 | 43.7 | 4.4 | | sha1 | 54.6 | 43.9 | 4.4 | | sha256 | 54.0 | 43.6 | 4.4 | +-----------+------+------+------+¶
If we look at summaries by additional bits and by algorithm we see:¶
Error per added bit +------------+-------+-------+-------+ | Added bits | MRMSE | MMAE | MMAPE | +------------+-------+-------+-------+ | 0 | 168.3 | 148.1 | 14.8 | | 1 | 113.9 | 98.4 | 9.8 | | 2 | 75.7 | 62.9 | 6.3 | | 3 | 60.3 | 51.2 | 5.1 | | 4 | 51.5 | 43.6 | 4.4 | | 5 | 45.4 | 38.7 | 3.9 | +------------+-------+-------+-------+ Error per algorithm +-----------+-------+-------+-------+ | Algorithm | MRMSE | MMAE | MMAPE | +-----------+-------+-------+-------+ | add | 50.7 | 43.9 | 4.4 | | mask | 35.1 | 29.9 | 3.0 | | xor | 53.6 | 48.0 | 4.8 | | crc-ccitt | 48.1 | 42.7 | 4.3 | | md4 | 137.9 | 119.9 | 12.0 | | md5 | 127.7 | 108.2 | 10.8 | | sha1 | 111.8 | 94.5 | 9.4 | | sha256 | 122.0 | 103.5 | 10.3 | +-----------+-------+-------+-------+¶
This leads us to propose that we endorse the use of the set of algorithms: add, mask, xor, and crc-ccitt and that we 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.¶
No security issues are discussed in this document.¶
This document makes no requests of IANA.¶
#!/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 simulate(p, bits): total = p + bits # Uniform distribution #samples = random.randint(0, (2 ** total), (2 ** p) * DEPTH) # Normal distribution # This emulates a 'poor' random number generator floats = random.normal(2 ** (total - 1), scale=2 ** (total - 3), size=(2 ** p) * 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 ** total else (2 ** total - 1) for x in samples ] # Debugging # print (samples) # #count, bins, ignored = plt.hist(samples, bins = 2 ** total) #plt.title('Random samples using %d bits of entropy' % # total) #plt.show() # 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 samples ] # 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 headers = ['Hash', 'RMSE', 'MAE', 'MAPE'] summary_headers = ['Added bits', 'MRMSE', 'MMAE', 'MMAPE'] algo_summary_headers = ['Algorithm', 'MRMSE', 'MMAE', 'MMAPE'] 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'))¶
For 2-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 653.0 | 653.0 | 65.3 | | mask | 374.0 | 374.0 | 37.4 | | xor | 653.0 | 653.0 | 65.3 | | crc-ccitt | 653.0 | 653.0 | 65.3 | | md4 | 653.0 | 653.0 | 65.3 | | md5 | 371.0 | 371.0 | 37.1 | | sha1 | 374.0 | 374.0 | 37.4 | | sha256 | 374.0 | 374.0 | 37.4 | +-----------+-------+-------+------+ For 4-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 363.9 | 307.5 | 30.8 | | mask | 28.6 | 26.0 | 2.6 | | xor | 464.4 | 437.5 | 43.8 | | crc-ccitt | 51.5 | 45.0 | 4.5 | | md4 | 979.4 | 933.5 | 93.3 | | md5 | 515.3 | 489.0 | 48.9 | | sha1 | 597.6 | 500.0 | 50.0 | | sha256 | 360.8 | 264.5 | 26.5 | +-----------+-------+-------+------+ For 8-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 164.7 | 145.8 | 14.6 | | mask | 23.0 | 16.8 | 1.7 | | xor | 220.3 | 206.0 | 20.6 | | crc-ccitt | 445.4 | 445.2 | 44.5 | | md4 | 339.7 | 262.0 | 26.2 | | md5 | 300.8 | 259.5 | 25.9 | | sha1 | 301.6 | 264.5 | 26.5 | | sha256 | 457.0 | 392.0 | 39.2 | +-----------+-------+-------+------+ For 16-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 73.5 | 61.1 | 6.1 | | mask | 18.7 | 14.4 | 1.4 | | xor | 107.6 | 97.4 | 9.7 | | crc-ccitt | 29.0 | 24.0 | 2.4 | | md4 | 428.1 | 322.1 | 32.2 | | md5 | 356.8 | 270.5 | 27.0 | | sha1 | 363.1 | 297.9 | 29.8 | | sha256 | 401.1 | 283.9 | 28.4 | +-----------+-------+-------+------+ For 32-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 56.0 | 43.9 | 4.4 | | mask | 28.6 | 23.0 | 2.3 | | xor | 66.7 | 58.4 | 5.8 | | crc-ccitt | 27.2 | 21.0 | 2.1 | | md4 | 259.2 | 197.6 | 19.8 | | md5 | 246.0 | 202.8 | 20.3 | | sha1 | 271.2 | 226.1 | 22.6 | | sha256 | 266.6 | 225.1 | 22.5 | +-----------+-------+-------+------+ For 64-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 35.5 | 28.8 | 2.9 | | mask | 30.5 | 24.1 | 2.4 | | xor | 39.8 | 31.2 | 3.1 | | crc-ccitt | 33.0 | 24.9 | 2.5 | | md4 | 202.6 | 166.2 | 16.6 | | md5 | 175.4 | 138.9 | 13.9 | | sha1 | 221.7 | 184.4 | 18.4 | | sha256 | 159.9 | 126.1 | 12.6 | +-----------+-------+-------+------+ For 128-way ECMP with 0 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 32.7 | 25.0 | 2.5 | | mask | 31.2 | 24.6 | 2.5 | | xor | 31.1 | 25.4 | 2.5 | | crc-ccitt | 30.3 | 24.3 | 2.4 | | md4 | 131.8 | 107.3 | 10.7 | | md5 | 128.5 | 103.8 | 10.4 | | sha1 | 132.9 | 105.4 | 10.5 | | sha256 | 127.8 | 99.8 | 10.0 | +-----------+-------+-------+------+ For 256-way ECMP with 0 more bits of entropy: +-----------+-------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+------+------+ | add | 29.7 | 23.7 | 2.4 | | mask | 32.3 | 26.1 | 2.6 | | xor | 32.1 | 25.4 | 2.5 | | crc-ccitt | 30.5 | 24.3 | 2.4 | | md4 | 101.9 | 82.2 | 8.2 | | md5 | 97.3 | 78.8 | 7.9 | | sha1 | 100.2 | 79.9 | 8.0 | | sha256 | 101.7 | 80.7 | 8.1 | +-----------+-------+------+------+ For 512-way ECMP with 0 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 30.9 | 24.6 | 2.5 | | mask | 31.4 | 24.8 | 2.5 | | xor | 30.0 | 24.1 | 2.4 | | crc-ccitt | 32.4 | 26.1 | 2.6 | | md4 | 72.6 | 57.5 | 5.8 | | md5 | 73.8 | 57.9 | 5.8 | | sha1 | 77.1 | 61.6 | 6.2 | | sha256 | 72.9 | 56.9 | 5.7 | +-----------+------+------+------+ For 1024-way ECMP with 0 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.2 | 25.7 | 2.6 | | mask | 31.4 | 25.2 | 2.5 | | xor | 32.0 | 25.2 | 2.5 | | crc-ccitt | 31.3 | 24.9 | 2.5 | | md4 | 54.4 | 43.7 | 4.4 | | md5 | 54.9 | 43.2 | 4.3 | | sha1 | 57.1 | 44.8 | 4.5 | | sha256 | 56.5 | 45.5 | 4.5 | +-----------+------+------+------+ For 2048-way ECMP with 0 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.1 | 24.9 | 2.5 | | mask | 31.1 | 24.6 | 2.5 | | xor | 31.7 | 25.4 | 2.5 | | crc-ccitt | 31.7 | 25.3 | 2.5 | | md4 | 46.0 | 36.9 | 3.7 | | md5 | 45.8 | 36.9 | 3.7 | | sha1 | 46.3 | 37.2 | 3.7 | | sha256 | 45.8 | 36.4 | 3.6 | +-----------+------+------+------+ For 4096-way ECMP with 0 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.5 | 25.1 | 2.5 | | mask | 31.9 | 25.6 | 2.6 | | xor | 31.7 | 25.4 | 2.5 | | crc-ccitt | 31.1 | 24.8 | 2.5 | | md4 | 38.8 | 31.0 | 3.1 | | md5 | 40.2 | 31.8 | 3.2 | | sha1 | 39.0 | 31.1 | 3.1 | | sha256 | 39.1 | 31.2 | 3.1 | +-----------+------+------+------+ For 2-way ECMP with 1 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 232.0 | 232.0 | 23.2 | | mask | 4.0 | 4.0 | 0.4 | | xor | 115.0 | 115.0 | 11.5 | | crc-ccitt | 115.0 | 115.0 | 11.5 | | md4 | 727.0 | 727.0 | 72.7 | | md5 | 377.0 | 377.0 | 37.7 | | sha1 | 128.0 | 128.0 | 12.8 | | sha256 | 740.0 | 740.0 | 74.0 | +-----------+-------+-------+------+ For 4-way ECMP with 1 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 142.9 | 117.0 | 11.7 | | mask | 40.2 | 36.0 | 3.6 | | xor | 164.3 | 163.5 | 16.3 | | crc-ccitt | 28.4 | 24.5 | 2.5 | | md4 | 332.6 | 299.5 | 29.9 | | md5 | 537.7 | 425.5 | 42.5 | | sha1 | 217.0 | 183.5 | 18.4 | | sha256 | 348.2 | 312.5 | 31.2 | +-----------+-------+-------+------+ For 8-way ECMP with 1 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 59.0 | 55.2 | 5.5 | | mask | 26.1 | 22.8 | 2.3 | | xor | 95.8 | 94.2 | 9.4 | | crc-ccitt | 142.6 | 141.2 | 14.1 | | md4 | 444.7 | 397.5 | 39.8 | | md5 | 326.2 | 232.2 | 23.2 | | sha1 | 502.8 | 392.8 | 39.3 | | sha256 | 346.3 | 269.2 | 26.9 | +-----------+-------+-------+------+ For 16-way ECMP with 1 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 39.2 | 33.6 | 3.4 | | mask | 30.2 | 25.2 | 2.5 | | xor | 39.2 | 32.6 | 3.3 | | crc-ccitt | 27.9 | 22.8 | 2.3 | | md4 | 226.6 | 190.1 | 19.0 | | md5 | 255.0 | 194.4 | 19.4 | | sha1 | 194.6 | 164.1 | 16.4 | | sha256 | 252.1 | 226.4 | 22.6 | +-----------+-------+-------+------+ For 32-way ECMP with 1 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 27.5 | 20.8 | 2.1 | | mask | 29.4 | 24.1 | 2.4 | | xor | 35.1 | 29.2 | 2.9 | | crc-ccitt | 29.5 | 23.8 | 2.4 | | md4 | 196.1 | 169.6 | 17.0 | | md5 | 190.0 | 146.0 | 14.6 | | sha1 | 192.3 | 159.1 | 15.9 | | sha256 | 155.3 | 130.2 | 13.0 | +-----------+-------+-------+------+ For 64-way ECMP with 1 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 29.9 | 23.5 | 2.3 | | mask | 31.1 | 26.5 | 2.6 | | xor | 31.4 | 26.4 | 2.6 | | crc-ccitt | 31.9 | 25.4 | 2.5 | | md4 | 132.0 | 99.3 | 9.9 | | md5 | 122.4 | 101.4 | 10.1 | | sha1 | 150.1 | 124.7 | 12.5 | | sha256 | 145.6 | 105.8 | 10.6 | +-----------+-------+-------+------+ For 128-way ECMP with 1 more bits of entropy: +-----------+-------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+------+------+ | add | 32.8 | 26.9 | 2.7 | | mask | 35.3 | 28.3 | 2.8 | | xor | 31.8 | 25.6 | 2.6 | | crc-ccitt | 28.8 | 22.6 | 2.3 | | md4 | 96.1 | 78.4 | 7.8 | | md5 | 103.7 | 82.2 | 8.2 | | sha1 | 101.1 | 80.6 | 8.1 | | sha256 | 94.5 | 71.8 | 7.2 | +-----------+-------+------+------+ For 256-way ECMP with 1 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.2 | 24.8 | 2.5 | | mask | 32.1 | 25.8 | 2.6 | | xor | 32.6 | 25.7 | 2.6 | | crc-ccitt | 33.9 | 26.5 | 2.6 | | md4 | 71.7 | 57.5 | 5.8 | | md5 | 69.4 | 56.7 | 5.7 | | sha1 | 74.7 | 59.8 | 6.0 | | sha256 | 70.3 | 55.6 | 5.6 | +-----------+------+------+------+ For 512-way ECMP with 1 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 33.3 | 26.6 | 2.7 | | mask | 31.9 | 25.2 | 2.5 | | xor | 32.1 | 26.1 | 2.6 | | crc-ccitt | 30.8 | 24.8 | 2.5 | | md4 | 52.7 | 41.5 | 4.2 | | md5 | 55.6 | 44.9 | 4.5 | | sha1 | 56.2 | 44.7 | 4.5 | | sha256 | 55.6 | 44.4 | 4.4 | +-----------+------+------+------+ For 1024-way ECMP with 1 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 30.9 | 24.9 | 2.5 | | mask | 31.5 | 25.1 | 2.5 | | xor | 31.3 | 24.9 | 2.5 | | crc-ccitt | 31.7 | 25.5 | 2.5 | | md4 | 46.6 | 37.4 | 3.7 | | md5 | 46.1 | 36.6 | 3.7 | | sha1 | 44.8 | 36.2 | 3.6 | | sha256 | 46.9 | 37.3 | 3.7 | +-----------+------+------+------+ For 2048-way ECMP with 1 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.1 | 25.5 | 2.6 | | mask | 30.9 | 24.7 | 2.5 | | xor | 32.1 | 25.6 | 2.6 | | crc-ccitt | 31.4 | 25.0 | 2.5 | | md4 | 40.0 | 31.7 | 3.2 | | md5 | 39.9 | 31.9 | 3.2 | | sha1 | 38.7 | 30.9 | 3.1 | | sha256 | 39.1 | 31.5 | 3.1 | +-----------+------+------+------+ For 4096-way ECMP with 1 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.3 | 24.9 | 2.5 | | mask | 31.6 | 25.3 | 2.5 | | xor | 31.9 | 25.5 | 2.5 | | crc-ccitt | 31.2 | 25.0 | 2.5 | | md4 | 35.6 | 28.5 | 2.8 | | md5 | 34.8 | 27.8 | 2.8 | | sha1 | 36.0 | 28.6 | 2.9 | | sha256 | 35.7 | 28.7 | 2.9 | +-----------+------+------+------+ For 2-way ECMP with 2 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 19.0 | 19.0 | 1.9 | | mask | 1.0 | 1.0 | 0.1 | | xor | 65.0 | 65.0 | 6.5 | | crc-ccitt | 65.0 | 65.0 | 6.5 | | md4 | 216.0 | 216.0 | 21.6 | | md5 | 103.0 | 103.0 | 10.3 | | sha1 | 244.0 | 244.0 | 24.4 | | sha256 | 8.0 | 8.0 | 0.8 | +-----------+-------+-------+------+ For 4-way ECMP with 2 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 39.7 | 31.5 | 3.1 | | mask | 16.8 | 13.0 | 1.3 | | xor | 45.4 | 45.0 | 4.5 | | crc-ccitt | 70.9 | 57.5 | 5.8 | | md4 | 139.6 | 114.0 | 11.4 | | md5 | 546.3 | 465.0 | 46.5 | | sha1 | 163.2 | 135.0 | 13.5 | | sha256 | 363.0 | 299.0 | 29.9 | +-----------+-------+-------+------+ For 8-way ECMP with 2 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 14.9 | 11.2 | 1.1 | | mask | 35.3 | 31.2 | 3.1 | | xor | 25.2 | 24.0 | 2.4 | | crc-ccitt | 21.6 | 17.8 | 1.8 | | md4 | 256.7 | 174.5 | 17.4 | | md5 | 201.8 | 171.5 | 17.1 | | sha1 | 329.0 | 290.8 | 29.1 | | sha256 | 249.7 | 202.8 | 20.3 | +-----------+-------+-------+------+ For 16-way ECMP with 2 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 29.5 | 22.5 | 2.3 | | mask | 26.4 | 21.1 | 2.1 | | xor | 23.2 | 19.8 | 2.0 | | crc-ccitt | 18.6 | 13.1 | 1.3 | | md4 | 197.0 | 158.1 | 15.8 | | md5 | 242.6 | 196.4 | 19.6 | | sha1 | 182.9 | 149.6 | 15.0 | | sha256 | 214.0 | 171.1 | 17.1 | +-----------+-------+-------+------+ For 32-way ECMP with 2 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 36.7 | 32.0 | 3.2 | | mask | 30.3 | 24.0 | 2.4 | | xor | 29.1 | 23.5 | 2.4 | | crc-ccitt | 39.8 | 30.8 | 3.1 | | md4 | 136.0 | 111.8 | 11.2 | | md5 | 140.7 | 115.0 | 11.5 | | sha1 | 127.3 | 105.9 | 10.6 | | sha256 | 119.3 | 99.4 | 9.9 | +-----------+-------+-------+------+ For 64-way ECMP with 2 more bits of entropy: +-----------+-------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+------+------+ | add | 31.6 | 25.7 | 2.6 | | mask | 32.1 | 26.3 | 2.6 | | xor | 30.0 | 24.3 | 2.4 | | crc-ccitt | 35.9 | 29.8 | 3.0 | | md4 | 92.6 | 72.4 | 7.2 | | md5 | 107.4 | 82.1 | 8.2 | | sha1 | 107.2 | 87.8 | 8.8 | | sha256 | 108.7 | 85.5 | 8.5 | +-----------+-------+------+------+ For 128-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 35.2 | 28.5 | 2.8 | | mask | 31.7 | 25.4 | 2.5 | | xor | 32.1 | 26.2 | 2.6 | | crc-ccitt | 31.1 | 24.8 | 2.5 | | md4 | 69.5 | 55.0 | 5.5 | | md5 | 76.5 | 61.0 | 6.1 | | sha1 | 73.3 | 59.1 | 5.9 | | sha256 | 70.9 | 58.5 | 5.8 | +-----------+------+------+------+ For 256-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 33.2 | 25.5 | 2.5 | | mask | 29.7 | 23.6 | 2.4 | | xor | 31.4 | 25.4 | 2.5 | | crc-ccitt | 30.3 | 23.7 | 2.4 | | md4 | 56.3 | 44.5 | 4.4 | | md5 | 54.7 | 43.7 | 4.4 | | sha1 | 54.6 | 43.9 | 4.4 | | sha256 | 54.0 | 43.6 | 4.4 | +-----------+------+------+------+ For 512-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.5 | 25.4 | 2.5 | | mask | 30.5 | 24.1 | 2.4 | | xor | 30.5 | 24.6 | 2.5 | | crc-ccitt | 31.8 | 24.9 | 2.5 | | md4 | 46.0 | 36.8 | 3.7 | | md5 | 43.9 | 34.8 | 3.5 | | sha1 | 44.3 | 35.3 | 3.5 | | sha256 | 48.2 | 38.7 | 3.9 | +-----------+------+------+------+ For 1024-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.0 | 24.8 | 2.5 | | mask | 33.0 | 26.5 | 2.6 | | xor | 31.6 | 25.0 | 2.5 | | crc-ccitt | 32.2 | 25.4 | 2.5 | | md4 | 39.4 | 31.6 | 3.2 | | md5 | 38.2 | 30.3 | 3.0 | | sha1 | 38.8 | 31.0 | 3.1 | | sha256 | 39.2 | 31.2 | 3.1 | +-----------+------+------+------+ For 2048-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.2 | 25.1 | 2.5 | | mask | 32.9 | 26.3 | 2.6 | | xor | 31.9 | 25.6 | 2.6 | | crc-ccitt | 31.8 | 25.5 | 2.6 | | md4 | 35.1 | 28.1 | 2.8 | | md5 | 35.8 | 28.5 | 2.8 | | sha1 | 37.1 | 29.8 | 3.0 | | sha256 | 35.6 | 28.4 | 2.8 | +-----------+------+------+------+ For 4096-way ECMP with 2 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.5 | 25.1 | 2.5 | | mask | 31.7 | 25.1 | 2.5 | | xor | 31.7 | 25.2 | 2.5 | | crc-ccitt | 31.8 | 25.5 | 2.6 | | md4 | 34.1 | 27.1 | 2.7 | | md5 | 34.0 | 27.0 | 2.7 | | sha1 | 33.3 | 26.4 | 2.6 | | sha256 | 33.9 | 26.9 | 2.7 | +-----------+------+------+------+ For 2-way ECMP with 3 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 15.0 | 15.0 | 1.5 | | mask | 36.0 | 36.0 | 3.6 | | xor | 17.0 | 17.0 | 1.7 | | crc-ccitt | 17.0 | 17.0 | 1.7 | | md4 | 58.0 | 58.0 | 5.8 | | md5 | 383.0 | 383.0 | 38.3 | | sha1 | 74.0 | 74.0 | 7.4 | | sha256 | 126.0 | 126.0 | 12.6 | +-----------+-------+-------+------+ For 4-way ECMP with 3 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 25.7 | 22.5 | 2.2 | | mask | 28.8 | 24.5 | 2.5 | | xor | 23.1 | 22.5 | 2.2 | | crc-ccitt | 16.4 | 13.0 | 1.3 | | md4 | 389.1 | 386.0 | 38.6 | | md5 | 196.3 | 168.5 | 16.8 | | sha1 | 125.8 | 101.5 | 10.2 | | sha256 | 185.9 | 168.5 | 16.8 | +-----------+-------+-------+------+ For 8-way ECMP with 3 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 21.9 | 18.5 | 1.9 | | mask | 28.2 | 25.0 | 2.5 | | xor | 20.1 | 17.2 | 1.7 | | crc-ccitt | 23.2 | 21.0 | 2.1 | | md4 | 146.5 | 123.0 | 12.3 | | md5 | 253.1 | 182.5 | 18.2 | | sha1 | 102.5 | 84.8 | 8.5 | | sha256 | 140.9 | 132.8 | 13.3 | +-----------+-------+-------+------+ For 16-way ECMP with 3 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 29.9 | 23.8 | 2.4 | | mask | 33.4 | 26.1 | 2.6 | | xor | 27.2 | 24.2 | 2.4 | | crc-ccitt | 25.7 | 20.6 | 2.1 | | md4 | 113.4 | 78.2 | 7.8 | | md5 | 161.0 | 134.8 | 13.5 | | sha1 | 140.6 | 113.8 | 11.4 | | sha256 | 153.3 | 130.2 | 13.0 | +-----------+-------+-------+------+ For 32-way ECMP with 3 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 24.5 | 19.0 | 1.9 | | mask | 32.6 | 26.7 | 2.7 | | xor | 29.8 | 24.3 | 2.4 | | crc-ccitt | 29.7 | 24.1 | 2.4 | | md4 | 87.3 | 72.6 | 7.3 | | md5 | 78.0 | 64.2 | 6.4 | | sha1 | 86.2 | 71.3 | 7.1 | | sha256 | 130.5 | 107.0 | 10.7 | +-----------+-------+-------+------+ For 64-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.6 | 26.4 | 2.6 | | mask | 34.9 | 29.4 | 2.9 | | xor | 32.2 | 26.2 | 2.6 | | crc-ccitt | 29.6 | 24.2 | 2.4 | | md4 | 69.1 | 54.8 | 5.5 | | md5 | 74.7 | 60.7 | 6.1 | | sha1 | 73.8 | 60.2 | 6.0 | | sha256 | 73.8 | 57.7 | 5.8 | +-----------+------+------+------+ For 128-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 30.7 | 24.4 | 2.4 | | mask | 30.7 | 25.2 | 2.5 | | xor | 32.5 | 25.8 | 2.6 | | crc-ccitt | 29.2 | 23.5 | 2.4 | | md4 | 56.4 | 44.4 | 4.4 | | md5 | 59.1 | 47.9 | 4.8 | | sha1 | 57.6 | 45.8 | 4.6 | | sha256 | 58.2 | 48.2 | 4.8 | +-----------+------+------+------+ For 256-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.2 | 25.4 | 2.5 | | mask | 32.1 | 25.3 | 2.5 | | xor | 32.5 | 26.1 | 2.6 | | crc-ccitt | 30.8 | 25.3 | 2.5 | | md4 | 45.6 | 35.1 | 3.5 | | md5 | 48.9 | 40.5 | 4.1 | | sha1 | 45.2 | 35.4 | 3.5 | | sha256 | 43.7 | 34.2 | 3.4 | +-----------+------+------+------+ For 512-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 28.3 | 22.7 | 2.3 | | mask | 30.0 | 24.5 | 2.4 | | xor | 30.4 | 24.5 | 2.5 | | crc-ccitt | 32.3 | 25.6 | 2.6 | | md4 | 37.3 | 30.3 | 3.0 | | md5 | 41.0 | 32.4 | 3.2 | | sha1 | 38.7 | 31.0 | 3.1 | | sha256 | 39.6 | 31.4 | 3.1 | +-----------+------+------+------+ For 1024-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.4 | 25.4 | 2.5 | | mask | 31.2 | 24.8 | 2.5 | | xor | 31.3 | 25.0 | 2.5 | | crc-ccitt | 31.4 | 25.0 | 2.5 | | md4 | 37.0 | 29.3 | 2.9 | | md5 | 34.4 | 27.5 | 2.8 | | sha1 | 35.4 | 28.2 | 2.8 | | sha256 | 36.1 | 28.5 | 2.8 | +-----------+------+------+------+ For 2048-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.6 | 25.3 | 2.5 | | mask | 32.4 | 25.9 | 2.6 | | xor | 31.7 | 25.6 | 2.6 | | crc-ccitt | 31.7 | 25.4 | 2.5 | | md4 | 32.7 | 26.1 | 2.6 | | md5 | 33.0 | 26.4 | 2.6 | | sha1 | 34.1 | 27.2 | 2.7 | | sha256 | 33.5 | 26.9 | 2.7 | +-----------+------+------+------+ For 4096-way ECMP with 3 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.7 | 25.3 | 2.5 | | mask | 31.5 | 24.9 | 2.5 | | xor | 31.5 | 25.3 | 2.5 | | crc-ccitt | 31.6 | 25.1 | 2.5 | | md4 | 32.9 | 26.2 | 2.6 | | md5 | 32.2 | 25.7 | 2.6 | | sha1 | 33.2 | 26.5 | 2.6 | | sha256 | 32.4 | 25.8 | 2.6 | +-----------+------+------+------+ For 2-way ECMP with 4 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 19.0 | 19.0 | 1.9 | | mask | 46.0 | 46.0 | 4.6 | | xor | 10.0 | 10.0 | 1.0 | | crc-ccitt | 10.0 | 10.0 | 1.0 | | md4 | 54.0 | 54.0 | 5.4 | | md5 | 237.0 | 237.0 | 23.7 | | sha1 | 74.0 | 74.0 | 7.4 | | sha256 | 284.0 | 284.0 | 28.4 | +-----------+-------+-------+------+ For 4-way ECMP with 4 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 42.2 | 35.0 | 3.5 | | mask | 27.1 | 23.5 | 2.4 | | xor | 54.6 | 46.0 | 4.6 | | crc-ccitt | 54.8 | 50.0 | 5.0 | | md4 | 199.2 | 180.0 | 18.0 | | md5 | 113.2 | 105.0 | 10.5 | | sha1 | 132.3 | 110.5 | 11.1 | | sha256 | 106.6 | 97.5 | 9.8 | +-----------+-------+-------+------+ For 8-way ECMP with 4 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 23.0 | 19.2 | 1.9 | | mask | 29.4 | 23.5 | 2.4 | | xor | 16.0 | 13.5 | 1.4 | | crc-ccitt | 25.4 | 20.2 | 2.0 | | md4 | 86.7 | 55.5 | 5.6 | | md5 | 144.4 | 127.5 | 12.8 | | sha1 | 141.1 | 110.0 | 11.0 | | sha256 | 90.5 | 82.8 | 8.3 | +-----------+-------+-------+------+ For 16-way ECMP with 4 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 31.2 | 27.4 | 2.7 | | mask | 32.7 | 26.6 | 2.7 | | xor | 32.0 | 26.5 | 2.7 | | crc-ccitt | 28.9 | 24.2 | 2.4 | | md4 | 132.7 | 106.1 | 10.6 | | md5 | 101.7 | 80.4 | 8.0 | | sha1 | 99.5 | 75.6 | 7.6 | | sha256 | 70.0 | 56.2 | 5.6 | +-----------+-------+-------+------+ For 32-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 28.7 | 22.5 | 2.3 | | mask | 32.7 | 28.6 | 2.9 | | xor | 26.9 | 21.3 | 2.1 | | crc-ccitt | 25.4 | 20.9 | 2.1 | | md4 | 50.1 | 40.1 | 4.0 | | md5 | 79.1 | 61.1 | 6.1 | | sha1 | 75.3 | 65.1 | 6.5 | | sha256 | 92.5 | 76.0 | 7.6 | +-----------+------+------+------+ For 64-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 33.5 | 27.7 | 2.8 | | mask | 31.0 | 25.6 | 2.6 | | xor | 26.8 | 21.6 | 2.2 | | crc-ccitt | 34.9 | 26.5 | 2.6 | | md4 | 60.3 | 46.9 | 4.7 | | md5 | 57.8 | 46.4 | 4.6 | | sha1 | 61.5 | 49.6 | 5.0 | | sha256 | 55.7 | 46.7 | 4.7 | +-----------+------+------+------+ For 128-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.9 | 25.5 | 2.6 | | mask | 33.0 | 26.2 | 2.6 | | xor | 32.8 | 25.7 | 2.6 | | crc-ccitt | 31.3 | 24.8 | 2.5 | | md4 | 45.7 | 35.7 | 3.6 | | md5 | 44.8 | 36.0 | 3.6 | | sha1 | 44.7 | 37.1 | 3.7 | | sha256 | 44.4 | 36.0 | 3.6 | +-----------+------+------+------+ For 256-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.3 | 25.5 | 2.6 | | mask | 30.8 | 24.5 | 2.5 | | xor | 31.6 | 25.6 | 2.6 | | crc-ccitt | 29.5 | 23.3 | 2.3 | | md4 | 38.0 | 30.3 | 3.0 | | md5 | 38.0 | 31.4 | 3.1 | | sha1 | 38.2 | 30.4 | 3.0 | | sha256 | 36.3 | 28.3 | 2.8 | +-----------+------+------+------+ For 512-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 30.2 | 24.3 | 2.4 | | mask | 31.7 | 25.6 | 2.6 | | xor | 29.5 | 23.5 | 2.3 | | crc-ccitt | 29.9 | 24.0 | 2.4 | | md4 | 37.6 | 30.1 | 3.0 | | md5 | 35.4 | 27.9 | 2.8 | | sha1 | 36.2 | 29.1 | 2.9 | | sha256 | 35.4 | 27.8 | 2.8 | +-----------+------+------+------+ For 1024-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.1 | 25.7 | 2.6 | | mask | 31.5 | 25.3 | 2.5 | | xor | 33.0 | 26.5 | 2.6 | | crc-ccitt | 31.8 | 25.1 | 2.5 | | md4 | 33.5 | 26.8 | 2.7 | | md5 | 33.6 | 26.7 | 2.7 | | sha1 | 33.2 | 26.5 | 2.6 | | sha256 | 33.5 | 26.5 | 2.6 | +-----------+------+------+------+ For 2048-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 32.2 | 25.9 | 2.6 | | mask | 32.5 | 25.7 | 2.6 | | xor | 32.3 | 25.9 | 2.6 | | crc-ccitt | 31.4 | 25.1 | 2.5 | | md4 | 32.5 | 26.0 | 2.6 | | md5 | 32.5 | 25.9 | 2.6 | | sha1 | 33.1 | 26.5 | 2.6 | | sha256 | 32.3 | 25.7 | 2.6 | +-----------+------+------+------+ For 4096-way ECMP with 4 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.4 | 25.1 | 2.5 | | mask | 31.6 | 25.2 | 2.5 | | xor | 31.4 | 24.9 | 2.5 | | crc-ccitt | 32.0 | 25.6 | 2.6 | | md4 | 32.6 | 25.9 | 2.6 | | md5 | 32.5 | 26.0 | 2.6 | | sha1 | 31.8 | 25.3 | 2.5 | | sha256 | 32.3 | 25.8 | 2.6 | +-----------+------+------+------+ For 2-way ECMP with 5 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 13.0 | 13.0 | 1.3 | | mask | 14.0 | 14.0 | 1.4 | | xor | 11.0 | 11.0 | 1.1 | | crc-ccitt | 11.0 | 11.0 | 1.1 | | md4 | 374.0 | 374.0 | 37.4 | | md5 | 112.0 | 112.0 | 11.2 | | sha1 | 72.0 | 72.0 | 7.2 | | sha256 | 4.0 | 4.0 | 0.4 | +-----------+-------+-------+------+ For 4-way ECMP with 5 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 12.4 | 10.5 | 1.1 | | mask | 40.2 | 38.0 | 3.8 | | xor | 24.1 | 23.5 | 2.4 | | crc-ccitt | 15.3 | 12.5 | 1.2 | | md4 | 115.9 | 110.0 | 11.0 | | md5 | 123.6 | 109.0 | 10.9 | | sha1 | 119.1 | 116.0 | 11.6 | | sha256 | 203.2 | 161.5 | 16.2 | +-----------+-------+-------+------+ For 8-way ECMP with 5 more bits of entropy: +-----------+-------+-------+------+ | Hash | RMSE | MAE | MAPE | +-----------+-------+-------+------+ | add | 20.0 | 16.5 | 1.7 | | mask | 35.3 | 30.0 | 3.0 | | xor | 22.5 | 20.2 | 2.0 | | crc-ccitt | 30.9 | 25.8 | 2.6 | | md4 | 116.2 | 101.5 | 10.2 | | md5 | 47.7 | 39.8 | 4.0 | | sha1 | 70.3 | 61.8 | 6.2 | | sha256 | 112.3 | 103.0 | 10.3 | +-----------+-------+-------+------+ For 16-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 27.3 | 21.4 | 2.1 | | mask | 25.4 | 22.9 | 2.3 | | xor | 28.6 | 23.4 | 2.3 | | crc-ccitt | 25.4 | 22.0 | 2.2 | | md4 | 82.9 | 65.1 | 6.5 | | md5 | 82.1 | 67.8 | 6.8 | | sha1 | 76.0 | 64.5 | 6.5 | | sha256 | 68.9 | 57.4 | 5.7 | +-----------+------+------+------+ For 32-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 28.5 | 23.8 | 2.4 | | mask | 39.0 | 29.8 | 3.0 | | xor | 30.2 | 23.9 | 2.4 | | crc-ccitt | 30.5 | 25.8 | 2.6 | | md4 | 51.6 | 40.9 | 4.1 | | md5 | 46.1 | 35.8 | 3.6 | | sha1 | 64.7 | 51.9 | 5.2 | | sha256 | 49.5 | 41.7 | 4.2 | +-----------+------+------+------+ For 64-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 36.1 | 26.4 | 2.6 | | mask | 36.7 | 29.4 | 2.9 | | xor | 37.6 | 28.0 | 2.8 | | crc-ccitt | 34.1 | 27.9 | 2.8 | | md4 | 45.7 | 38.0 | 3.8 | | md5 | 48.8 | 41.0 | 4.1 | | sha1 | 44.7 | 35.4 | 3.5 | | sha256 | 39.0 | 32.6 | 3.3 | +-----------+------+------+------+ For 128-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.0 | 25.0 | 2.5 | | mask | 30.7 | 24.7 | 2.5 | | xor | 29.9 | 25.0 | 2.5 | | crc-ccitt | 31.7 | 26.5 | 2.6 | | md4 | 39.4 | 31.2 | 3.1 | | md5 | 35.3 | 28.7 | 2.9 | | sha1 | 39.2 | 31.6 | 3.2 | | sha256 | 35.8 | 28.2 | 2.8 | +-----------+------+------+------+ For 256-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 30.2 | 24.3 | 2.4 | | mask | 32.2 | 26.2 | 2.6 | | xor | 29.8 | 24.0 | 2.4 | | crc-ccitt | 31.3 | 25.4 | 2.5 | | md4 | 34.9 | 27.8 | 2.8 | | md5 | 32.2 | 25.6 | 2.6 | | sha1 | 34.7 | 27.7 | 2.8 | | sha256 | 34.4 | 27.6 | 2.8 | +-----------+------+------+------+ For 512-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.0 | 24.7 | 2.5 | | mask | 31.8 | 25.2 | 2.5 | | xor | 31.9 | 25.0 | 2.5 | | crc-ccitt | 32.1 | 25.1 | 2.5 | | md4 | 32.8 | 26.2 | 2.6 | | md5 | 32.6 | 26.1 | 2.6 | | sha1 | 32.7 | 26.1 | 2.6 | | sha256 | 33.4 | 26.2 | 2.6 | +-----------+------+------+------+ For 1024-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 30.9 | 24.4 | 2.4 | | mask | 30.5 | 24.6 | 2.5 | | xor | 31.9 | 25.3 | 2.5 | | crc-ccitt | 32.1 | 25.7 | 2.6 | | md4 | 32.6 | 26.1 | 2.6 | | md5 | 33.5 | 26.5 | 2.7 | | sha1 | 32.9 | 26.3 | 2.6 | | sha256 | 32.2 | 25.6 | 2.6 | +-----------+------+------+------+ For 2048-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.4 | 25.1 | 2.5 | | mask | 32.0 | 25.2 | 2.5 | | xor | 31.7 | 25.4 | 2.5 | | crc-ccitt | 31.5 | 25.3 | 2.5 | | md4 | 32.1 | 25.4 | 2.5 | | md5 | 31.8 | 25.4 | 2.5 | | sha1 | 31.7 | 25.2 | 2.5 | | sha256 | 32.5 | 25.9 | 2.6 | +-----------+------+------+------+ For 4096-way ECMP with 5 more bits of entropy: +-----------+------+------+------+ | Hash | RMSE | MAE | MAPE | +-----------+------+------+------+ | add | 31.9 | 25.7 | 2.6 | | mask | 32.0 | 25.7 | 2.6 | | xor | 32.2 | 25.7 | 2.6 | | crc-ccitt | 32.2 | 25.5 | 2.6 | | md4 | 32.5 | 26.0 | 2.6 | | md5 | 32.2 | 25.5 | 2.6 | | sha1 | 31.9 | 25.5 | 2.5 | | sha256 | 32.2 | 25.7 | 2.6 | +-----------+------+------+------+ Error per added bit +------------+-------+-------+-------+ | Added bits | MRMSE | MMAE | MMAPE | +------------+-------+-------+-------+ | 0 | 168.3 | 148.1 | 14.8 | | 1 | 113.9 | 98.4 | 9.8 | | 2 | 75.7 | 62.9 | 6.3 | | 3 | 60.3 | 51.2 | 5.1 | | 4 | 51.5 | 43.6 | 4.4 | | 5 | 45.4 | 38.7 | 3.9 | +------------+-------+-------+-------+ Error per algorithm +-----------+-------+-------+-------+ | Algorithm | MRMSE | MMAE | MMAPE | +-----------+-------+-------+-------+ | add | 50.7 | 43.9 | 4.4 | | mask | 35.1 | 29.9 | 3.0 | | xor | 53.6 | 48.0 | 4.8 | | crc-ccitt | 48.1 | 42.7 | 4.3 | | md4 | 137.9 | 119.9 | 12.0 | | md5 | 127.7 | 108.2 | 10.8 | | sha1 | 111.8 | 94.5 | 9.4 | | sha256 | 122.0 | 103.5 | 10.3 | +-----------+-------+-------+-------+¶