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)
pointer适用于数组和字符串,并pointer(x)返回存储在Ptr{X}其中的X类型x(极端情况是基类中的标准字符串,尽管它UInt8是eltypeis String)Char。这为您提供了存储数据的指针;两个不同的对象可以将指针与==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 === s2起objectid将返回相同的值;hash是基于而不是基于的标准哈希值。这意味着例如两个数组和将具有相同的散列(因为它们具有相同的内容并使用 进行比较)但具有不同,因为使用进行比较时它们不相同isequal===x=[1]y=[1]isequalobjectid======意味着比较测试传递给它的对象是否无法区分。在大多数情况下使用的简单规则是:
(最后一个规则有点棘手,例如两个字符串s1="12"并s2="12"使用比较相等===,因为它们是不可变的,但实际上它们可以使用函数来区分)pointer
正如您所看到的,规则有点复杂,以确保在常见情况下用户得到他们期望的东西。