Commit 2f860ff2 by Zachary Snow

fix trivial hash collisions

Data.Hashable can produce hashes differing little in their upper bits if
only the last character of the string is changed. Because we were using
the upper bits of the hash in shortHash, this could lead to avoidable
hash collisions. This change includes minor simplification optimizations
which surfaced this collision in the existing struct_ident_scope test.
parent a863321d
...@@ -185,6 +185,7 @@ rangeSize (s, e) = ...@@ -185,6 +185,7 @@ rangeSize (s, e) =
-- returns the size of a range known to be ordered -- returns the size of a range known to be ordered
rangeSizeHiLo :: Range -> Expr rangeSizeHiLo :: Range -> Expr
rangeSizeHiLo (SizedRange size) = size
rangeSizeHiLo (hi, lo) = rangeSizeHiLo (hi, lo) =
simplify $ BinOp Add (BinOp Sub hi lo) (RawNum 1) simplify $ BinOp Add (BinOp Sub hi lo) (RawNum 1)
...@@ -206,9 +207,10 @@ endianCondRange r r1 r2 = ...@@ -206,9 +207,10 @@ endianCondRange r r1 r2 =
-- returns the total size of a set of dimensions -- returns the total size of a set of dimensions
dimensionsSize :: [Range] -> Expr dimensionsSize :: [Range] -> Expr
dimensionsSize [] = RawNum 1
dimensionsSize ranges = dimensionsSize ranges =
simplify $ simplify $
foldl (BinOp Mul) (RawNum 1) $ foldl1 (BinOp Mul) $
map rangeSize $ map rangeSize $
ranges ranges
......
...@@ -32,6 +32,7 @@ module Language.SystemVerilog.AST ...@@ -32,6 +32,7 @@ module Language.SystemVerilog.AST
) where ) where
import Text.Printf (printf) import Text.Printf (printf)
import Data.Bits ((.&.))
import Data.Hashable (hash) import Data.Hashable (hash)
import Language.SystemVerilog.AST.Attr as Attr import Language.SystemVerilog.AST.Attr as Attr
...@@ -82,5 +83,5 @@ lhsToExpr (LHSStream o e ls) = Stream o e $ map lhsToExpr ls ...@@ -82,5 +83,5 @@ lhsToExpr (LHSStream o e ls) = Stream o e $ map lhsToExpr ls
shortHash :: (Show a) => a -> String shortHash :: (Show a) => a -> String
shortHash x = shortHash x =
take 5 $ printf "%05X" val printf "%05X" $ val .&. 0xFFFFF
where val = hash $ show x where val = hash $ show x
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment