如果我计算clojure map中'pr-str'的CID,它是否是唯一的?
我想知道一个 clojure 映射在将其提供给摘要函数时是否可能有非唯一哈希值。
这取决于摘要,而不是map,它是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中的集合和映射,除了其他一些东西之外,是可以调用的——就这么简单。