如果计算 clojure 地图的 'pr-str' 的 CID,它是唯一的吗?
我想知道 Clojure 地图是否可能对摘要函数产生非唯一的哈希值。
这取决于摘要,而不是地图,也不是由于来自 Clojure 或使用了 pr-str
而决定。
按照定义,任何合理的摘要都是一种有损函数,因此它总是允许冲突,即使某些摘要的可能性非常小。
我在代码中首先写上了 :one。
但是它是否总是在 :two 之前呢?
哈希集/地图的顺序是未定义的。但相同的对象会有相同的顺序。
然而,即使内容相同,不同对象的顺序也可能不同
user=> (mapv hash [0 0.])
[0 0]
user=> (pr-str (hash-map 0 0 0. 0))
"{0 0, 0.0 0}"
user=> (pr-str (hash-map 0. 0 0 0))
"{0.0 0, 0 0}"
如果我运行上述代码,它是否总会返回一个唯一的值?
根据上述内容,这并不保证。对于一个有损函数,如摘要,永远不能保证。
我认为 Clojure 地图是具有特殊 bind
或 >>=
操作符的集合,当使用集合的某个元素调用它时,将返回该元素绑定的内容。
这似乎与问题无关。但在这种情况下,Clojure 的集合或地图没有任何特殊之处,Clojure 也没有操作符。
Clojure 中的集合和地图在某种程度上是可调用的——就这么简单。