encoding/protojson: add random whitespaces in encoding output

This is meant to deter users from doing byte for byte comparison.

Change-Id: If005d2dc1eba45eaa4254171d2f247820db109e4
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/194037
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/encoding/json/encode.go b/internal/encoding/json/encode.go
index 39a5014..741f34f 100644
--- a/internal/encoding/json/encode.go
+++ b/internal/encoding/json/encode.go
@@ -8,6 +8,7 @@
 	"strconv"
 	"strings"
 
+	"google.golang.org/protobuf/internal/detrand"
 	"google.golang.org/protobuf/internal/errors"
 )
 
@@ -132,6 +133,11 @@
 		if e.lastType&(Null|Bool|Number|String|EndObject|EndArray) != 0 &&
 			next&(Name|Null|Bool|Number|String|StartObject|StartArray) != 0 {
 			e.out = append(e.out, ',')
+			// For single-line output, add a random extra space after each
+			// comma to make output unstable.
+			if detrand.Bool() {
+				e.out = append(e.out, ' ')
+			}
 		}
 		return
 	}
@@ -160,5 +166,10 @@
 
 	case e.lastType&Name != 0:
 		e.out = append(e.out, ' ')
+		// For multi-line output, add a random extra space after key: to make
+		// output unstable.
+		if detrand.Bool() {
+			e.out = append(e.out, ' ')
+		}
 	}
 }