如果我用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中的集合和映射,与其他东西一样,是可以调用的——就这么简单。