如果 我计算一个 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 中的集合和地图是可调用的——就这么简单。