2024年的Clojure状态调查!分享你的想法。

欢迎!请查阅关于页面,了解如何使用本平台。

0
打印
编辑

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

CID是什么?
它是内容的摘要。
SHA-256或其他摘要函数,无关紧要。
我想知道Clojure地图在输入摘要函数时是否可能会有非唯一的哈希值。
```(sha-256 (pr-str {:one 1 :two 2}))```

现在,我将一个映射想象成一组键值向量集。

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

在代码中我首先写的是 :one。
但这是否总是比 :two 先出现呢?

如果运行上述代码,它是否总是返回一个唯一的值?
by
我想象 Clojure 映射拥有一个特殊的 `bind` 或 `>>=` 操作符,使得可以使用其元素“调用”集合,以返回绑定给该元素的内容。

({: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
我可能会选择使用向量。
(这条消息假设您想计算一个具有如下属性的散列/摘要函数D:对于任何两个无序集合s1和s2,如果(= s1 s2)为真,则 (= (D s1) (D s2))也为真。
同样适用于无序的Clojure地图.)

请注意,完全有可能开发出对无序对象(如无序集合和Clojure地图)具有确定性的摘要/散列函数。事实上,`clojure.core/hash`就是这样一种函数。这样的函数必须始终在元素(对于集合)或键/值对(对于Clojure地图)的顺序不受影响的情况下产生相同的结果。这限制了函数的计算方式,并且许多用于摘要的函数 _并不_ 适合这种目的。

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

2 个答案

+1

选择
 
最佳答案

Clojure中的映射(除了排序映射)是无序的,它们的打印顺序可能因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中的集合和映射在许多其他方面都是可调用的——就是那么简单。


编辑了
摘要冲突极不可能发生。所以这不是我担心的。
我担心的是“双摘要结果”的反例,这可能和投掷硬币出现正面的可能性一样大,针对有两条条目的映射。
by
编辑 by
这似乎与问题中的其余部分无关。但是,在这方面,Clojure中的集合或映射没有特别之处,Clojure也没有操作符。
Clojure中的集合和映射,在许多其他事物中,是可调用的——就这么简单。

我只是描述了一个关于正在发生的事情的理论模型。这是根据我对Clojure内幕和性能关注的有限知识所能想到的最好的。

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