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

欢迎!请参阅关于页面,了解更多关于该功能的信息。

0
打印
编辑

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

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

现在我设想一个map是一个包含键值向量的集合

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

在我的代码中,我首先写了 :one。
但它们是否总是按照这样的顺序来?

如果运行上面的代码,它是否会总是返回一个唯一的值?
我设想Clojure中的map是一个带有特殊`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/

我想我将会为了保持map的全球唯一标识,而在处理序列化可预测性的情况下使用`sorted-map`。

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

嗯,当数据结构需要在运行时跨多个环境存在时,没有关于序列化协议的额外信息,它们的序列化形式是不可比的,这感觉有点奇怪。
我可能会用向量代替。
by
(此消息假设您想要计算一个具有以下属性的哈希/摘要函数D:对于任何两个无序集s1, s2,如果(= s1 s2)为真,那么(=(D s1)(D s2))也为真。
同样应用于无序Clojure映射)。

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

如果希望使用一个哈希/摘要函数,其中当给它作为输入的元素顺序改变时,该函数的输出也会改变,那么我建议您可能不会得到想使用的结果。

2 个答案

+1
by
选定 by
 
最佳答案

映射(除了排序映射)是无序的,可能在不同版本的Clojure、JVM版本和Clojure打印系统中可能打印的顺序不同,这是可以被自定义和扩展的系统。

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

by
下面这个是否也可以这样说?

'(into [] a-map)

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

如果我对Clojure映射的'pr-str'计算CID,它是否是唯一的?
我想知道Clojure地图在送入摘要函数时是否可能产生非唯一的哈希值。

这取决于摘要,而不是映射,这是Clojure的事实,或者你使用了pr-str。
根据定义,任何合理的摘要都是一个有损函数,因此它总是允许冲突,即使某些摘要的概率极低。

在我的代码中,我首先写了 :one。
但它们是否总是按照这样的顺序来?

散列集合/映射的顺序是未定义的。但对于同一个对象来说,它们是相同的。
然而,即使内容相同,不同的对象也可能不同

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的一个纯粹理论方面,它不涉及性能或实现或持久性限制。类似于‘数据驱动的集合理论’。
...