【问题标题】:What is the difference between objectid(), hash(), pointer_from_obj() and pointer() in Julia?Julia 中的 objectid()、hash()、pointer_from_obj() 和 pointer() 有什么区别?
【发布时间】:2018-10-20 00:00:53
【问题描述】:

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.

【问题讨论】:

  • 文档是怎么说的?阅读文档后,还有哪些问题?关于阅读的文档,详细展开这些问题。
  • 这就是我问的原因,因为我不懂文档!

标签: julia


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

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

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

【讨论】:

  • 非常感谢!很多有用的信息。顺便问一下,你在哪里学的?官方文档没有那么有用...
  • 最后你需要阅读源代码以防万一。幸运的是,其中大部分都在 Julia 中。
猜你喜欢
  • 2019-09-29
  • 1970-01-01
  • 2017-10-31
  • 2016-04-28
  • 2018-02-13
  • 2010-10-27
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多