[array] Use dagger for hashing array

Also switch to better mixing.
diff --git a/src/hb-array.hh b/src/hb-array.hh
index 16f53cc..fc8d39d 100644
--- a/src/hb-array.hh
+++ b/src/hb-array.hh
@@ -278,10 +278,11 @@
 template <typename T>
 uint32_t hb_array_t<T>::hash () const
 {
-  uint32_t h = 0;
-  for (unsigned i = 0; i < length; i++)
-    h ^= hb_hash (arrayZ[i]);
-  return h;
+  return
+  + hb_iter (this)
+  | hb_map (hb_hash)
+  | hb_reduce ([] (uint32_t a, uint32_t b) -> uint32_t { return a * 31 + b; }, 0)
+  ;
 }
 
 typedef hb_array_t<const char> hb_bytes_t;