如果您计算一个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中的集合和映射,在许多其他事物中,是可调用的——就是这样。