如果我计算Clojure映射'pr-str'的CID,是否是唯一的?
我想知道当将 Clojure 地图输入到摘要函数时,是否可能产生非唯一的散列值。
这取决于摘要,而不是映射的事实,它来自Clojure,或者您是否使用pr-str
。
根据定义,任何合理的摘要都是一个丢失函数,因此它始终允许冲突,即使某些摘要的可能性极小。
在我的代码中,我首先写出了 :一。
但它是不是总是先于 :二 出现呢?
哈希集/映射的顺序是未定义的。但对于相同的对象,它们的顺序是相同的。
然而,即使内容相同,对于不同的对象,它们的顺序也可能不同
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中的集合和映射,在许多其他事项中,是可调用的——如此简单。