VOL-3029 - Changed flow hashing to only take into account tableId, priority, and match.

Also optimized hash computation.
Also modified FlowMatch() and FindFlows() to use a simple comparison based on the hash (flow.Id).

Change-Id: Ic82f340405fd3eb2d0a683e3d552759145097f8f
diff --git a/pkg/flows/flow_utils_test.go b/pkg/flows/flow_utils_test.go
index c4e481d..ec00cb1 100644
--- a/pkg/flows/flow_utils_test.go
+++ b/pkg/flows/flow_utils_test.go
@@ -37,11 +37,6 @@
 	timeoutError = status.Errorf(codes.Aborted, "timeout")
 }
 
-func TestHashFlowStatsNil(t *testing.T) {
-	_, err := HashFlowStats(nil)
-	assert.EqualError(t, err, "hash-flow-stats-nil-flow")
-}
-
 func TestFlowsAndGroups_AddFlow(t *testing.T) {
 	fg := NewFlowsAndGroups()
 	allFlows := fg.ListFlows()
@@ -261,7 +256,7 @@
 	fg.AddGroup(group)
 
 	str = fg.String()
-	assert.True(t, strings.Contains(str, "id: 1143307409938767207"))
+	assert.True(t, strings.Contains(str, "id: 11819684229970388353"))
 	assert.True(t, strings.Contains(str, "group_id: 10"))
 	assert.True(t, strings.Contains(str, "oxm_class: OFPXMC_OPENFLOW_BASICOFPXMC_OPENFLOW_BASIC"))
 	assert.True(t, strings.Contains(str, "type: OFPXMT_OFB_VLAN_VIDOFPXMT_OFB_VLAN_VID"))
@@ -503,6 +498,7 @@
 	assert.Nil(t, err)
 	assert.False(t, FlowMatch(flow1, nil))
 
+	// different table_id, cookie, flags
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -521,6 +517,7 @@
 	assert.False(t, FlowMatch(flow1, flow2))
 	assert.False(t, FlowMatch(nil, flow2))
 
+	// no difference
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -535,6 +532,7 @@
 	assert.Nil(t, err)
 	assert.True(t, FlowMatch(flow1, flow2))
 
+	// different priority
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 501, "table_id": 1, "cookie": 38268468, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -552,6 +550,7 @@
 	assert.Nil(t, err)
 	assert.False(t, FlowMatch(flow1, flow2))
 
+	// different table id
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 2, "cookie": 38268468, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -566,6 +565,7 @@
 	assert.Nil(t, err)
 	assert.False(t, FlowMatch(flow1, flow2))
 
+	// different cookie
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268467, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -578,8 +578,9 @@
 	}
 	flow2, err = MkFlowStat(fa)
 	assert.Nil(t, err)
-	assert.False(t, FlowMatch(flow1, flow2))
+	assert.True(t, FlowMatch(flow1, flow2))
 
+	// different flags
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 14},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -592,8 +593,9 @@
 	}
 	flow2, err = MkFlowStat(fa)
 	assert.Nil(t, err)
-	assert.False(t, FlowMatch(flow1, flow2))
+	assert.True(t, FlowMatch(flow1, flow2))
 
+	// different match InPort
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -608,6 +610,7 @@
 	assert.Nil(t, err)
 	assert.False(t, FlowMatch(flow1, flow2))
 
+	// different match Ipv4Dst
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{
@@ -621,6 +624,7 @@
 	assert.Nil(t, err)
 	assert.False(t, FlowMatch(flow1, flow2))
 
+	// different actions
 	fa = &FlowArgs{
 		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
 		MatchFields: []*ofp.OfpOxmOfbField{