`unchecked-multiply` multiplies exactly two numeric arguments without checking for integer overflow. Its result type follows numeric type promotion, so it is not necessarily an `int`. Use it when overflow is intentional, such as in integer-based hashing. section 5.13
Basic multiplication
`(unchecked-multiply 10 3)` returns `30`. Unlike ordinary arithmetic operators, `unchecked-multiply` does not accept more than two arguments. section 5.13
For specifically 32-bit signed integer arithmetic, use `unchecked-multiply-int` instead. It takes two numeric arguments within the `int` range, casts them to primitive `int`, and returns an `int` result that wraps on overflow. By contrast, `unchecked-multiply` can retain a more precise result type according to its operands. section 5.14 section 5.13
(defn scramble [^long x ^long y] ; #1
(unchecked-add (unchecked-multiply 31 x) y)) ; #2
(defn hash-str [s] ; #3
(let [large-prime 1125899906842597] ; #4
(reduce scramble large-prime (map int s)))) ; #5
(hash-str "couple words") ; #6
;; 1664082230529263278
(hash-str "even longer sentences")
;; -7674745620208396614
A string-hashing example combines `unchecked-multiply` with `unchecked-add` to make overflowing arithmetic part of the calculation. section 5.13
