Hash clojure中的文本哈希集

Hash clojure中的文本哈希集,hash,clojure,hashset,Hash,Clojure,Hashset,每当我用文字符号在Clojure中定义散列集时,它都会像这样搅乱值: user=> #{1 2 4 6 5} 它返回了以下消息: #{1 4 6 2 5} 但是当我把 user=> #{1 4 6 2 5} 它返回: user=> #{1 4 6 2 5} 这背后的逻辑是什么?根据定义,集合是无序的。因此,就接口而言,顺序是任意的。然而,哈希集无疑会将其成员存储在某种哈希表中。因此,枚举哈希集成员的自然方法是迭代内部哈希表。因此,元素的生成顺序将取决于元素的哈希值,以及

每当我用文字符号在Clojure中定义散列集时,它都会像这样搅乱值:

user=> #{1 2 4 6 5}
它返回了以下消息:

#{1 4 6 2 5}
但是当我把

user=> #{1 4 6 2 5}
它返回:

user=> #{1 4 6 2 5}

这背后的逻辑是什么?

根据定义,集合是无序的。因此,就接口而言,顺序是任意的。然而,哈希集无疑会将其成员存储在某种哈希表中。因此,枚举哈希集成员的自然方法是迭代内部哈希表。因此,元素的生成顺序将取决于元素的哈希值,以及这些值如何映射到基础哈希表


这就是为什么元素的“排序”看起来是随机的,但却是可重复的。

嗯,可能是真的,但我最好说集合是未排序的。对于元素的顺序没有任何保证。如果您想要一个排序集,您可以使用排序集,它甚至可以使用successive conj保持排序顺序:
(conj(排序集1 4 6 5)2);=>#{1 2 4 5 6}
很好。我添加了更多的细节(希望)解释了与散列值的关系,而没有推断出直接的关系。“元素的顺序似乎是随机的,但可以重复”…考虑到这个实现。同样有效的实现可以在每次读取后包含随机洗牌。@tar,是的,一个实现可能会产生随机洗牌序列。但这似乎是有计划的,所以我不认为这是一个非常“自然”的实现。它也不是一个纯函数。最后,这不是Clojure的
PersistentHashSet
s的实现方式。Clojure的
sortedset
函数存在是有原因的。