Break the broken hash
I got more than enough answers without reversing both abs calls, so I skipped that.  They'd be trivial to add back if really needed.  I'm not even taking long overflow into account, but that'd let you insert most any word you like in the greater hashes.  As if that was needed to get collisions.

import Data.Char
import Data.Bits
import Control.Monad

printables = [32..95]

reverseModShift11 x = do
  let zeros = head $ filter (testBit x) [0..]
  b &lt;- [0 .. zeros]
  let h = x `shiftR` b
  guard $ (h `mod` 11) == (fromIntegral b)
  return h

reverseBase p m n | m &lt; 13    = []
                  | n &lt;  0    = []
                  | n == 0 &amp;&amp; m == 13 = return p
                  | otherwise = do
  let r = n `mod` m
  c &lt;- filter (\x -&gt; x `mod` m == r) printables
  reverseBase (chr c:p) (m-1) ((n-c) `div` m)

reverseBases = join . ap (map (reverseBase "") [14..29]) . return

breakHash = reverseModShift11 &gt;=&gt; reverseBases


Sample use:

*Main&gt; breakHash 224443104
["]#'!'","\\2'!'","[A'!'","ZP'!'","Y_'!'",
  (...)
"[?EAK","ZNEAK","Y]EAK",
  (...)
"] TQ]","\\/TQ]","[&gt;TQ]","ZMTQ]","Y\\TQ]"]