首页 > 解决方案 > Julia 中的 objectid()、hash()、pointer_from_obj() 和 pointer() 有什么区别?

问题描述

objectid(), hash(),pointer()pointer_from_objref()Julia有什么区别?

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

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.

标签: julia

解决方案


  • pointer适用于数组和字符串,并pointer(x)返回Ptr{X}where Xis 存储的类型x(极端情况是标准字符串在 base 中,尽管UInt8is )。这为您提供了存储数据的指针;两个不同的对象可以让指针比较为真,例如,你会得到(尽管这些指针有不同的类型);eltypeStringChar==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是基于not的标准哈希值。这意味着例如两个数组和将具有相同的散列(因为它们具有相同的内容并且使用 比较相等)但是由于使用比较时它们不相同,所以它们不同isequal===x=[1]y=[1]isequalobjectid===
  • ===表示比较测试传递给它的对象是否无法区分。在大多数情况下使用的简单规则是:
    • 对象对于不可变对象具有相同的值
    • 对象对于可变对象具有相同的内存位置

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

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


推荐阅读