如果我在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中的集合和映射可以调用,就是这样。