我一直的印象是那台是没有顺序的下,但注意到,人物套做似乎下令:
(seq #{\e \c \b \z \a})
=> (\a \b \c \e \z)
Run Code Online (Sandbox Code Playgroud)
如果我介绍其他类型的字符,似乎它们是根据字符的代码进行排序:
(seq #{\e \A \c \space \b \z \a})
=> (\space \A \a \b \c \e \z)
Run Code Online (Sandbox Code Playgroud)
为什么字符根据其代码进行排序,但数字集似乎有任意排序?
ama*_*loy 10
这是因为Character/hashCode它直接与角色的序号相关联,而且集合基于散列图.但是如果引入足够的字符来开始获取哈希冲突,那么表观排序并不完全一致:
; 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)
Run Code Online (Sandbox Code Playgroud)
但是当然,正如您所知,这不是一个定义的行为,而是当前实现如何发挥作用.
现在,你问为什么数字不会发生这种情况:原因是,Clojure明确地避免了它!(.hashCode 1)返回1,因为这是Java定义其哈希码的方式.但是Clojure的hash函数使用的是murmur3,它返回的数字值完全不同于返回输入:(hash 1)yield 1392991556.我不是这方面的专家,但我相信使用murmur而不是Java的内置哈希函数的主要动机是避免出于安全原因,哈希冲突.时间攻击还是什么?