+ Hasher hash = Hashing.sha256().newHasher();
+ hash.putString("Profile(");
+ hash.putString(name.getFingerprint());
+ hash.putString(birthDate.getFingerprint());
+ if (avatar != null) {
+ hash.putString("Avatar(").putString(avatar).putString(")");
+ }
+ hash.putString("ContactInformation(");
+ for (Field field : fields) {
+ hash.putString(field.getName()).putString("(").putString(field.getValue()).putString(")");
+ }
+ hash.putString(")");
+ hash.putString(")");
+
+ return hash.hash().toString();
+ }
+
+ /**
+ * Container for a profile field.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ public static class Field {
+
+ /** The ID of the field. */
+ private final String id;
+
+ /** The name of the field. */
+ private String name;
+
+ /** The value of the field. */
+ private String value;
+
+ public Field(String name) {
+ this(name, null);
+ }
+
+ public Field(String name, String value) {
+ this(randomUUID().toString(), name, value);
+ }
+
+ public Field(String id, String name, String value) {
+ this.id = checkNotNull(id, "id must not be null");
+ this.name = name;
+ this.value = value;
+ }
+
+ /**
+ * Returns the ID of this field.
+ *
+ * @return The ID of this field
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Returns the name of this field.
+ *
+ * @return The name of this field
+ */
+ public String getName() {
+ return name;