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

欢迎!请参阅关于页面以了解有关如何工作的更多信息。

0
打印
编辑

一个 clojure 映射的序列表示法是否具有明确定义?如果我将 clojure 映射的 'pr-str' 的 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)为真,则(= (D s1) (D s2))也为真。
类似地对于无序Clojure映射。)

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

如果您希望使用一个哈希/摘要函数,其中更改提供给它的输入元素的顺序会导致该函数的输出发生更改,那么我建议您不会得到一个希望使用的结果。

2 个回答

+1 投票

被 veixq9 选择为最佳答案
 
最佳答案

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

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

对于下面的内容也能这么说吗?

'(into [] a-map)

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

如果我计算clojure map中'pr-str'的CID,它是否是唯一的?
我想知道一个 clojure 映射在将其提供给摘要函数时是否可能有非唯一哈希值。

这取决于摘要,而不是map,它是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的一个纯理论方面,它没有先入为主的性能或实现或持久性约束。类似于“数据驱动的集合论”。
...