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