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

Die*_*rin 1 julia

objectid()Julia 中的、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)
Run Code Online (Sandbox Code Playgroud)

从文档中:

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.
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 5

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

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

正如您所看到的,规则有点复杂,以确保在常见情况下用户得到他们期望的东西。