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

欢迎!请访问 关于 页面了解此如何操作的相关信息。

0
打印
编辑

Clojure 映射的序列表示是否具有明确的定义?如果我对 Clojure 映射计算 'pr-str' 的 CID,这是否是唯一的?

CID 是什么?
它是内容摘要。
例如 SHA-256,或者任何摘要函数,无关紧要。
我想知道当将 Clojure 映射输入摘要函数时,可能会出现非唯一哈希值。
```(sha-256 (pr-str {:one 1 :two 2}))```

现在我将映射想象成一系列键值向量。

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

我在代码中首先写下了 :one。
但它是否总是出现在 :two 之前?

如果运行上述代码,它是否会始终返回一个唯一的值?
by
我认为Clojure映射集合配备了特殊的“绑定”或“>>=”运算符,使通过其一个元素调用集合时返回绑定给该元素的内容。

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

我想在使用全局唯一标识时会使用`sorted-map`来确保“序列化可预测性”。

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

感觉有点奇怪,应该能在运行时持续存在的数据结构,它们在序列化形式上是不可比较的,除非知道序列化协议信息。
by
我可能会选择使用向量。
by
(本信息假设您想计算一个具有以下属性的哈希/摘要函数D:对于任意两个无序集合s1和s2,如果(s1=s2)为真,则(D s1)=(D s2)也为真。
类似地,对于无序Clojure映射也是如此。

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

如果您想要使用一个哈希/摘要函数,其中给定作为输入的元素的顺序发生变化会导致该函数的输出也随之变化,那么我建议您不太可能得到一个您想要使用的结果。

2个答案

+1

被选中
 
最佳答案

(除了有序映射以外的)映射是无序的,并且其打印顺序可能会因Clojure版本、JVM版本以及您可能在Clojure打印系统中安装的任何自定义内容而异(该打印系统是可修改和扩展的)。

运行时中的同一个映射实例总是会以相同的顺序打印其元素 - 这是您唯一可以保证的。

是否能对以下内容说出同样的话?

'(into [] a-map)

换句话说,'无序映射的向量表示'是否未指定?
by
这是同一个问题:映射元素是如何按顺序添加到向量的?没有定义的顺序。
0
by

如果计算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中的集合和映射,与其他一些事物一样,是可以调用的 - 就这么简单。

by
编辑了 by
摘要冲突发生的概率极小。因此,这不是我所担心的。
我担心的是“双重摘要结果”的反面情况,这种情况可能和抛硬币出现正面的概率一样高,即具有两个条目的映射。
by
编辑 by
这似乎与问题的其他部分无关。但是,在这方面Clojure中的集合或映射并没有什么特别之处,Clojure也没有操作符。
Clojure中的集合和映射,除了其他一些事情之外,是可调用的——就这么简单。

我只是在描述一个关于正在发生什么的理论模型。这是我根据对Clojure内部知识和性能考虑的有限了解所能想象出的最好模型。

我认识到Clojure的一个纯理论方面,它不被性能或实现或持久性约束所占据。类似于“数据驱动的集合论”。
...