diff --git a/metric/metric.go b/metric/metric.go
index 0af445c2d1f9e7a6d6e1b3c5d943fa519cfaf94a..2c8fdb9c959932fb4d540bd0d0edeb32074ba610 100644
--- a/metric/metric.go
+++ b/metric/metric.go
@@ -232,9 +232,12 @@ func (m *metric) IsAggregate() bool {
 func (m *metric) HashID() uint64 {
 	h := fnv.New64a()
 	h.Write([]byte(m.name))
+	h.Write([]byte("\n"))
 	for _, tag := range m.tags {
 		h.Write([]byte(tag.Key))
+		h.Write([]byte("\n"))
 		h.Write([]byte(tag.Value))
+		h.Write([]byte("\n"))
 	}
 	return h.Sum64()
 }
diff --git a/metric/metric_test.go b/metric/metric_test.go
index 31f1729d8b006be967ea82ada9c617acd8673b77..1fecf2e449b622888efbc8d092c47c4e66579deb 100644
--- a/metric/metric_test.go
+++ b/metric/metric_test.go
@@ -267,6 +267,32 @@ func TestHashID_Consistency(t *testing.T) {
 	assert.Equal(t, m2.HashID(), m3.HashID())
 }
 
+func TestHashID_Delimiting(t *testing.T) {
+	m1, _ := New(
+		"cpu",
+		map[string]string{
+			"a": "x",
+			"b": "y",
+			"c": "z",
+		},
+		map[string]interface{}{
+			"value": float64(1),
+		},
+		time.Now(),
+	)
+	m2, _ := New(
+		"cpu",
+		map[string]string{
+			"a": "xbycz",
+		},
+		map[string]interface{}{
+			"value": float64(1),
+		},
+		time.Now(),
+	)
+	assert.NotEqual(t, m1.HashID(), m2.HashID())
+}
+
 func TestSetName(t *testing.T) {
 	m := baseMetric()
 	m.SetName("foo")