diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for Z-Data
 
+## 0.8.0.0  -- 2021-04-20
+
+* Change `Bytes` 's `Hashable` instance to use FNV-1a (proposed by @zypeh).
+
 ## 0.7.4.0  -- 2021-04-06
 
 * Add `emptyArr` to `Z.Data.Array`. 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,6 +4,7 @@
 [![Linux Build Status](https://github.com/ZHaskell/z-data/workflows/ubuntu-ci/badge.svg)](https://github.com/ZHaskell/z-data/actions)
 [![MacOS Build Status](https://github.com/haskell-Z/z-data/workflows/osx-ci/badge.svg)](https://github.com/ZHaskell/z-data/actions)
 [![Windows Build Status](https://github.com/ZHaskell/z-data/workflows/win-ci/badge.svg)](https://github.com/ZHaskell/z-data/actions)
+[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.svg)](https://gitter.im/Z-Haskell/community)
 
 This package is part of [ZHaskell](https://z.haskell.world) project, providing basic data structures and functions:
 
@@ -55,7 +56,7 @@
 > :set -XOverloadedStrings 
 >
 > -- Builders can be used with OverloadedStrings
-> B.buildBytes $ "builders: " >> B.hex (3 :: Word16) >> B.comma >> B.double 1.2345678
+> B.build $ "builders: " >> B.hex (3 :: Word16) >> B.comma >> B.double 1.2345678
 [98,117,105,108,100,101,114,115,58,32,48,48,48,51,44,49,46,50,51,52,53,54,55,56]
 > 
 > B.buildText $ "builders: " >> B.hex (3 :: Word16) >> B.comma >> B.double 1.2345678
diff --git a/Z-Data.cabal b/Z-Data.cabal
--- a/Z-Data.cabal
+++ b/Z-Data.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               Z-Data
-version:            0.7.4.0
+version:            0.8.0.0
 synopsis:           Array, vector and text
 description:        This package provides array, slice and text operations
 license:            BSD-3-Clause
@@ -187,9 +187,14 @@
     cc-options:      -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0600
 
   else
-    extra-libraries:
-      stdc++
-      pthread
+    if os(osx)
+      extra-libraries:
+          c++
+          pthread
+    else
+      extra-libraries:
+          stdc++
+          pthread
 
   if flag(integer-simple)
     cpp-options:   -DINTEGER_SIMPLE
diff --git a/Z/Data/Builder/Numeric.hs b/Z/Data/Builder/Numeric.hs
--- a/Z/Data/Builder/Numeric.hs
+++ b/Z/Data/Builder/Numeric.hs
@@ -492,11 +492,11 @@
 -- import Data.Word
 -- import Data.Int
 --
--- > T.validate . B.buildBytes $ B.hex (125 :: Int8)
+-- > T.validate . B.build $ B.hex (125 :: Int8)
 -- "7d"
--- > T.validate . B.buildBytes $ B.hex (-1 :: Int8)
+-- > T.validate . B.build $ B.hex (-1 :: Int8)
 -- "ff"
--- > T.validate . B.buildBytes $ B.hex (125 :: Word16)
+-- > T.validate . B.build $ B.hex (125 :: Word16)
 -- "007d"
 -- @
 --
diff --git a/Z/Data/Text/Print.hs b/Z/Data/Text/Print.hs
--- a/Z/Data/Text/Print.hs
+++ b/Z/Data/Text/Print.hs
@@ -129,7 +129,7 @@
     --
     -- You should return a 'B.Builder' writing in UTF8 encoding only, i.e.
     --
-    -- @Z.Data.Text.validateMaybe (Z.Data.Builder.buildBytes (toUTF8BuilderP p a)) /= Nothing@
+    -- @Z.Data.Text.validateMaybe (Z.Data.Builder.build (toUTF8BuilderP p a)) /= Nothing@
     toUTF8BuilderP :: Int -> a  -> B.Builder ()
 
     default toUTF8BuilderP :: (Generic a, GToText (Rep a)) => Int -> a -> B.Builder ()
diff --git a/Z/Data/Vector/Base.hs b/Z/Data/Vector/Base.hs
--- a/Z/Data/Vector/Base.hs
+++ b/Z/Data/Vector/Base.hs
@@ -444,10 +444,7 @@
     compare = comparePrimVector
 
 comparePrimVector :: (Prim a, Ord a) => PrimVector a -> PrimVector a -> Ordering
-{-# INLINE [1] comparePrimVector #-}
-{-# RULES
-    "comparePrimVector/Bytes" comparePrimVector = compareBytes
-  #-}
+{-# INLINE comparePrimVector #-}
 comparePrimVector (PrimVector baA sA lA) (PrimVector baB sB lB)
     | baA `sameArr` baB = if sA == sB then lA `compare` lB else go sA sB
     | otherwise = go sA sB
@@ -460,6 +457,11 @@
                            in case o of EQ -> go (i+1) (j+1)
                                         x  -> x
 
+-- | This is an INCOHERENT instance, compare binary data using SIMD.
+instance {-# INCOHERENT #-} Ord Bytes where
+    {-# INLINE compare #-}
+    compare = compareBytes
+
 compareBytes :: PrimVector Word8 -> PrimVector Word8 -> Ordering
 {-# INLINE compareBytes #-}
 compareBytes (PrimVector (PrimArray baA#) (I# sA#) lA)
@@ -513,10 +515,7 @@
     hashWithSalt = hashWithSaltPrimVector
 
 hashWithSaltPrimVector :: (Hashable a, Prim a) => Int -> PrimVector a -> Int
-{-# INLINE [1] hashWithSaltPrimVector #-}
-{-# RULES
-    "hashWithSaltPrimVector/Bytes" hashWithSaltPrimVector = hashWithSaltBytes
-  #-}
+{-# INLINE hashWithSaltPrimVector #-}
 hashWithSaltPrimVector salt0 (PrimVector arr s l) = go salt0 s
   where
     -- we don't do a final hash with length to keep consistent with Bytes's instance
@@ -524,6 +523,13 @@
     go !salt !i
         | i >= end  = salt
         | otherwise = go (hashWithSalt salt (indexPrimArray arr i)) (i+1)
+
+-- | This is an INCOHERENT instance, hash binary data using FNV-1a
+--
+-- Note this is different from @Vector Word8@ or @[Word8]@ which use FNV-1.
+instance {-# INCOHERENT #-} Hashable Bytes where
+    {-# INLINE hashWithSalt #-}
+    hashWithSalt = hashWithSaltBytes
 
 hashWithSaltBytes :: Int -> Bytes -> Int
 {-# INLINE hashWithSaltBytes #-}
diff --git a/cbits/bytes.c b/cbits/bytes.c
--- a/cbits/bytes.c
+++ b/cbits/bytes.c
@@ -53,10 +53,13 @@
     else return (p - a);
 }
 
-/* FNV-1 hash
+/* FNV-1a hash
  *
- * The FNV-1 hash description: http://isthe.com/chongo/tech/comp/fnv/
- * The FNV-1 hash is public domain: http://isthe.com/chongo/tech/comp/fnv/#public_domain
+ * The FNV-1a hash description: http://isthe.com/chongo/tech/comp/fnv/#FNV-1a
+ * The FNV-1a hash is public domain: http://isthe.com/chongo/tech/comp/fnv/#public_domain
+ * 
+ * Using FNV-1a because it has better avalanche properties compared to the FNV original version.
+ * See also https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed
  *
  * The original version from hashable use long type which doesn't match 'Int' in haskell and
  * cause problems on window, here we use HsInt.
@@ -65,7 +68,7 @@
 
     HsWord hash = salt;
     while (len--) {
-      hash = (hash * 16777619) ^ *str++;
+      hash = (hash ^ *str++) * 16777619;
     }
 
     return hash;
diff --git a/test/Z/Data/Vector/BaseSpec.hs b/test/Z/Data/Vector/BaseSpec.hs
--- a/test/Z/Data/Vector/BaseSpec.hs
+++ b/test/Z/Data/Vector/BaseSpec.hs
@@ -64,8 +64,6 @@
 
     describe "Bytes Hashable instance property" . modifyMaxSuccess (*10) . modifyMaxSize (*10) $ do
 
-        prop "Vector Word8's hash should be equal to hashWithSalt (Bytes's one) (Bytes's length)" $ \ xs ->
-            hash (V.pack @V.Vector @Word8 xs) === hashWithSalt (hash (V.pack @V.PrimVector @Word8 xs)) (List.length xs)
         prop "Vector a's hash should be equal to [a]'s hash" $ \ xs ->
             hash (V.pack @V.Vector @Word8 xs) === hash xs
         prop "Vector a's hash should be equal to [a]'s hash" $ \ xs ->
