
Hi, I've been playing around with `System.Mem.StableName` and `hashStableName` and stumbled across a behavior that seems to be rather weird. First of all the documentation of `hashStableName` says the following: The Int returned is not necessarily unique; several StableNames may map to the same Int (in practice however, the chances of this are small, so the result of hashStableName makes a good hash key). OK, sounds fine, let's put this to the test. So I wrote a little program. module Main where import Control.Monad import System.Mem.StableName import System.Environment main :: IO () main = do args <- getArgs res <- forM [0..10000] $ \i -> do x <- makeStableName i let h' = hashStableName x unless (null args) $ print h' return h' putStrLn "---------------------------" print $ minimum res print $ maximum res Running this program without an argument only prints aus the minimum and maximum hash values that where produced. So surprises here: $ ./Test --------------------------- 1 10000 Here is how things get a bit weird when I make the progam print out the hash values while they are being produced I get a completely different result. Not only that but I get a whole lot of hash collisions, since the hashes produced only seem to be within the range of 1 and 260. $ ./Test print [...] 128 127 126 125 124 123 122 121 120 119 118 117 116 115 114 --------------------------- 1 260 Am I missing something fundamental here, because this behavior seems to be rather confusing. Kind regards, raichoo