关于Base.hash()的一些疑惑

刚入门Julia,最近需要对自定义的结构体计算hash值,因为用的并不都是immutable类型的结构体,为了正确理解和计算hash,在这里向大家请教一些问题 :slightly_smiling_face:

  • mutableimmutable类型结构体做hash计算区别有什么?
  • 对数值向量或者矩阵是怎么做hash计算的,为啥对大型矩阵hash计算也那么快?
  • 如果向量元素是mutable类型的结构体呢?
  • 根据特定内容计算唯一值,除了hash()还有什么其它方式么?

在此先感谢大家了 :smiling_face_with_three_hearts:

个人认为,hash 和是不是可变的没什么关系,具体还是取决于对应类型的hash是怎么定义的。AbstractArrayhash定义在这里. 对于小数组,就是逐个元素hash,但是对于大数组有一个复杂度log(N)的算法。只要你的类型是AbstractArray并且不重载hash的情况下,不管是否可变,都是上面那个方法。
比如StaticArrays里面的SArrayMArray有一样的hash

julia> hash(SVector(1, 2, 3)) # immutable
0x902ea5284b019f89

julia> hash(MVector(1, 2, 3)) # mutable
0x902ea5284b019f89
4 个赞