Clojure 2024 年度调查! 中分享您的看法。

欢迎!有关如何使用此平台的更多信息,请参阅 关于 页面。

0
打印
编辑

Clojure 地图序列表示法是否明确定义?如果我计算一个 Clojure 地图的 'pr-str' 的 CID,是否是唯一的?

CID 是什么?
它是内容的摘要。
比如 SHA-256,或者任何摘要函数,都可以。
我想知道一个 Clojure 地图输入到摘要函数时是否可能有非唯一的散列。
```(sha-256 (pr-str {:one 1 :two 2}))```

现在我设想一个地图是一个键值向量的集合

```#{ [:one 1] [:two 2]  }```

我在代码中首先写了 :one。
但是它总是先于 :two 吗?

如果运行上述代码,它会始终返回一个唯一值吗?
我想 clojure 映射是带有特殊 `bind` 或 `>>=` 操作符的集合,它会将集合中的一个元素调用回来,返回该元素绑定的内容。

({:one 1 :two 2} :one) => 1
https://www.reddit.com/r/Clojure/comments/foqt7o/when_and_why_would_you_want_to_use_sorted_maps/

我猜,在涉及到映射的全局唯一标识时,为了“序列化可预测性”,我可能会使用 `sorted-map`。

碰巧 JSON 也是无序的。
https://groups.google.com/g/golang-nuts/c/opEBtevDCyI

嗯,觉得数据结构在运行时应该持久存在,但在没有有关序列化协议的更多信息的情况下,它们的序列化形式是不可比较的,这感觉有点奇怪。
可能我会使用向量。
(此信息假设你想要计算一个具有以下特性的哈希/摘要函数D:对于任何两个无序集合s1和s2,如果(= s1 s2)为true,则(= (D s1) (D s2))也为true。)
 同样适用于无序的Clojure映射。

请注意,完全有可能开发出一个对于无序对象(如无序集合和Clojure映射)来说是确定性的摘要/哈希函数。实际上,`clojure.core/hash`就是这样的一个函数。这样的函数必须始终产生相同的结果,无论其元素(对于集合)或键/值对(对于Clojure映射)的顺序。这限制了函数的计算方式,并且许多用于摘要的函数并不适用于该目的。

如果您想要使用一个哈希/摘要函数,该函数的输入元素顺序的改变会导致函数输出的改变,那么我建议您可能不会得到期望的结果。

2 答案

+1

选择
 
最佳答案

映射(除排序映射外)是无序的,并且可能因Clojure版本、JVM版本以及您在Clojure打印系统中可能安装的任何自定义而按不同的顺序打印。这些自定义是可修改和可扩展的。

运行时中的同一映射实例将始终以相同的顺序打印其元素——这是您唯一可以保证的。

以下内容也可以这样论述吗?

'(into [] a-map)

换句话说,“无序映射的向量表示”是不指定的吗?
这是同一个问题——添加到向量中的地图元素是什么顺序访问的?没有定义的顺序。
0

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


编辑
哈希冲突极不可能。所以这并不是我所担心的。
我担心的是“双重哈希结果”的情况,这种情况下,对于具有两个条目的地图,结果可能像掷硬币出现正面一样可能。

编辑了
"这似乎与问题的其余部分无关。但不是的,关于集合或映射,Clojure在这方面没有任何特别之处,Clojure没有操作符。
在Clojure中,集合和映射在其他的东西中,就像这样,具有可调用性。"

"我只是在描述一个关于正在发生什么事情的理论模型。这是我在有限了解Clojure内部和性能关注点的情况下,想象力所能及的最佳结果。 "

"我认识到Clojure的纯理论方面,不受性能或实现或持久性约束的干扰。就像一种‘数据驱动的集合论’。"
...