Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 为什么字符集看起来是有序的?_Clojure_Set - Fatal编程技术网

Clojure 为什么字符集看起来是有序的?

Clojure 为什么字符集看起来是有序的?,clojure,set,Clojure,Set,我一直认为集合是不有序的,但我注意到字符集合似乎是有序的: (seq #{\e \c \b \z \a}) => (\a \b \c \e \z) 如果我介绍其他类型的字符,它们似乎是根据字符的代码排序的: (seq #{\e \A \c \space \b \z \a}) => (\space \A \a \b \c \e \z) 为什么字符是按代码排序的,而数字集似乎具有任意顺序?这是因为字符/hashCode直接绑定到字符的序号,而数字集是基于hashmap的。但是,

我一直认为集合是不有序的,但我注意到字符集合似乎是有序的:

(seq #{\e \c \b \z \a}) 

=> (\a \b \c \e \z)
如果我介绍其他类型的字符,它们似乎是根据字符的代码排序的:

(seq #{\e \A \c \space \b \z \a})

=> (\space \A \a \b \c \e \z)

为什么字符是按代码排序的,而数字集似乎具有任意顺序?

这是因为
字符/hashCode
直接绑定到字符的序号,而数字集是基于hashmap的。但是,如果引入足够多的字符以开始获取哈希冲突,则明显的顺序并不完全一致:

; the whole alphabet is small enough to avoid collisions
user=> (apply str (set "abcdefghijklmnopqrstuvwxyz"))
"abcdefghijklmnopqrstuvwxyz"
; and observe the hashes are indeed sequential
user=> (map hash (set "abcdefghijklmnopqrstuvwxyz"))
(97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122)

; but go from 26 to 36 elements, and you start to see collisions
user=> (apply str (set "0123456789abcdefghijklmnopqrstuvwxyz"))
"abcdefghijklmno0p1q2r3s4t5u6v7w8x9yz"
user=> (map hash (set "0123456789abcdefghijklmnopqrstuvwxyz"))
(97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 48 112 49 113 50 114 51 115 52 116 53 117 54 118 55 119 56 120 57 121 122)
但当然,正如您所知,这不是一个定义的行为,而是目前实现的工作方式


现在,你会问为什么数字不会发生这种情况:原因是,Clojure明确避免了它
(.hashCode 1)
返回1,因为Java就是这样定义它的hashCode的。但是使用了Murruld3,它为数字返回的值与只返回输入的值完全不同:
(散列1)
产生1392991556。我不是这方面的专家,但我相信使用杂音代替Java内置哈希函数的主要动机是为了安全起见避免哈希冲突。定时攻击还是什么?

很有趣!所以字符使用Java的哈希实现,而数字使用Clojure的?是的,Characters.Cool中没有覆盖。感谢您的深入分析。很有趣。谢谢