Julia中的objectid(),hash(),pointer_from_obj()和pointer()有什么区别?

时间:2018-10-20 00:00:54

标签: julia

茱莉亚(Julia)中的objectid()hash()pointer()pointer_from_objref()有什么区别?

===比较的运算符是什么?

julia> L1 = [1,2,3];

julia> L2 = L1;

julia> L3 = copy(L1);

julia> objectid(L1), objectid(L2), objectid(L3)
(0xac55c2b098913d98, 0xac55c2b098913d98, 0xbdee7946bbc068f0)

julia> hash(L1), hash(L2), hash(L3)
(0xecc5186e7be222c6, 0xecc5186e7be222c6, 0xecc5186e7be222c6)

julia> pointer_from_objref(L1), pointer_from_objref(L2), pointer_from_objref(L3)
(Ptr{Nothing} @0x00007f6888141e40, Ptr{Nothing} @0x00007f6888141e40, Ptr{Nothing} @0x00007f68881438f0)

julia> pointer(L1), pointer(L2), pointer(L3)
(Ptr{Int64} @0x00007f6888141e80, Ptr{Int64} @0x00007f6888141e80, Ptr{Int64} @0x00007f6888143930)

从文档中:

objectid(x)                                                                                
Get a hash value for x based on object identity. objectid(x)==objectid(y) if x === y.      

hash(x[, h::UInt])                                                                         
Compute an integer hash code such that isequal(x,y) implies hash(x)==hash(y).              

pointer_from_objref(x)
Get the memory address of a Julia object as a Ptr.

pointer(array [, index])
Get the native address of an array or string, optionally at a given location index.

1 个答案:

答案 0 :(得分:2)

  • pointer适用于数组和字符串,并且pointer(x)返回Ptr{X},其中X是存储在x中的类型(特殊情况是基数中的标准字符串)尽管UInt8中的eltypeString,但它是Char的位置)。这为您提供了存储数据的指针;两个不同的对象可以使指针与==比较为真,例如使用x=[1]y=reinterpret(UInt8, x),您将获得pointer(x) == pointer(y)(尽管这些指针具有不同的类型);
  • pointer_from_objref对任何 mutable 对象起作用,并返回Ptr{Nothing}。对于数组和字符串,这与pointer不同,因为数组/字符串还具有一些存储在实际数据之前的元数据。
  • objectid-正如文档所述,是基于以下规则的哈希:如果两个对象xy具有x===y为真的属性,则它们应该具有相同的objectid(实际实现有点复杂,无法正确覆盖x===y规则-例如s1 = "12"s2 = "12"将很可能返回不同的值,例如pointer,但自s1 === s2之后,objectid将在它们上返回相同的值;
  • hash standard 哈希值,其基于isequal而不基于===。这意味着两个数组x=[1]y=[1]将具有相同的哈希值(因为它们具有相同的内容,并使用isequal比较相等),但是具有不同的objectid,因为它们不相同与===
  • 进行比较时
  • ===表示比较测试,确定传递给它的对象是否不可区分。在大多数情况下使用的简单规则是:
    • 对象与不可变对象具有相同的值
    • 对象与可变对象的存储位置相同

(最后一条规则有点棘手,例如两个字符串s1="12"s2="12"使用===比较相等,因为它们是不可变的,但实际上它们是可以区分的。 em>使用pointer函数)

因此,您可以看到规则很复杂,以确保在通常情况下用户能够得到期望的结果。