This is just an artifact of memory layout – hashing by identity is based on object_id which is based on memory address. It's not a meaningful behavioral difference between Julia versions. Sticking mutable objects for which hash and == disagree is an undefined behavior and causes dictionaries to do potentially weird things.
On Thu, Jul 16, 2015 at 12:04 PM, Seth <catch...@bromberger.com> wrote: > I can't because I just rebuilt to latest to test > https://github.com/JuliaLang/julia/issues/12063 - but I'll try on the > latest master... > > ... and Julia Version 0.4.0-dev+6005 Commit 242bf47 does not appear to > have the issue (I'm getting two results returned for unique()). > > On Thursday, July 16, 2015 at 8:36:03 AM UTC-7, Stefan Karpinski wrote: >> >> Dan and/or Seth, can you try that again and check if hash(foos[1]) and >> hash(foos[2]) have the same last hex digit? >> >> On Thu, Jul 16, 2015 at 11:30 AM, Matt Bauman <mba...@gmail.com> wrote: >> >>> Bizarre. I happen to have last updated on *exactly* the same commit >>> SHA, but I'm seeing the original (expected) behavior: >>> >>> $ julia -q >>> julia> versioninfo() >>> Julia Version 0.4.0-dev+5860 >>> Commit 7fa43ed (2015-07-08 20:57 UTC) >>> Platform Info: >>> System: Darwin (x86_64-apple-darwin14.3.0) >>> CPU: Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz >>> WORD_SIZE: 64 >>> BLAS: libopenblas (USE64BITINT NO_AFFINITY NEHALEM) >>> LAPACK: libopenblas >>> LIBM: libopenlibm >>> LLVM: libLLVM-3.3 >>> >>> julia> type Foo >>> x::Int >>> end >>> >>> julia> ==(f1::Foo, f2::Foo) = f1.x == f2.x >>> == (generic function with 109 methods) >>> >>> julia> unique([Foo(4),Foo(4)]) >>> 2-element Array{Foo,1}: >>> Foo(4) >>> Foo(4) >>> >>> julia> @which hash(Foo(4), zero(UInt)) >>> hash(x::ANY, h::UInt64) at hashing.jl:10 >>> >>> Might there be some package that changes this behavior? Is the result >>> of `@which hash(Foo(4), zero(Uint))` the same as what I show above? >>> >>> >>> On Thursday, July 16, 2015 at 11:02:46 AM UTC-4, Seth wrote: >>>> >>>> I can confirm this works as described by milktrader on 0.4.0-dev+5860 >>>> (2015-07-08 20:57 UTC) Commit 7fa43ed (7 days old master). >>>> >>>> julia> unique(foos) >>>> 1-element Array{Foo,1}: >>>> Foo(4) >>>> >>>> >>>> On Thursday, July 16, 2015 at 7:52:03 AM UTC-7, Stefan Karpinski wrote: >>>>> >>>>> I don't see that on 0.4-dev – it also doesn't seem possible without >>>>> having defined a hash method since unique is implemented with a dict. >>>>> >>>>> On Thu, Jul 16, 2015 at 10:29 AM, milktrader <milkt...@gmail.com> >>>>> wrote: >>>>> >>>>>> Julia 0.4- has different behavior ... >>>>>> >>>>>> First, with 0.3.9 >>>>>> >>>>>> julia> versioninfo() >>>>>> Julia Version 0.3.9 >>>>>> Commit 31efe69 (2015-05-30 11:24 UTC) >>>>>> Platform Info: >>>>>> System: Darwin (x86_64-apple-darwin13.4.0) >>>>>> CPU: Intel(R) Core(TM)2 Duo CPU P7350 @ 2.00GHz >>>>>> WORD_SIZE: 64 >>>>>> BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Penryn) >>>>>> LAPACK: libopenblas >>>>>> LIBM: libopenlibm >>>>>> LLVM: libLLVM-3.3 >>>>>> >>>>>> julia> type Foo >>>>>> x::Int >>>>>> end >>>>>> >>>>>> julia> import Base: == >>>>>> >>>>>> julia> ==(f1::Foo, f2::Foo) = f1.x == f2.x >>>>>> == (generic function with 80 methods) >>>>>> >>>>>> julia> foos = [Foo(4), Foo(4)] >>>>>> 2-element Array{Foo,1}: >>>>>> Foo(4) >>>>>> Foo(4) >>>>>> >>>>>> julia> unique(foos) >>>>>> 2-element Array{Foo,1}: >>>>>> Foo(4) >>>>>> Foo(4) >>>>>> >>>>>> julia> unique(foos)[1] == unique(foos)[2] >>>>>> true >>>>>> >>>>>> And now 0.4-dev >>>>>> >>>>>> julia> versioninfo() >>>>>> Julia Version 0.4.0-dev+5587 >>>>>> Commit 78760e2 (2015-06-25 14:27 UTC) >>>>>> Platform Info: >>>>>> System: Darwin (x86_64-apple-darwin13.4.0) >>>>>> CPU: Intel(R) Core(TM)2 Duo CPU P7350 @ 2.00GHz >>>>>> WORD_SIZE: 64 >>>>>> BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Penryn) >>>>>> LAPACK: libopenblas >>>>>> LIBM: libopenlibm >>>>>> LLVM: libLLVM-3.3 >>>>>> >>>>>> julia> type Foo >>>>>> x::Int >>>>>> end >>>>>> >>>>>> julia> import Base: == >>>>>> >>>>>> julia> ==(f1::Foo, f2::Foo) = f1.x == f2.x >>>>>> == (generic function with 108 methods) >>>>>> >>>>>> julia> foos = [Foo(4), Foo(4)] >>>>>> 2-element Array{Foo,1}: >>>>>> Foo(4) >>>>>> Foo(4) >>>>>> >>>>>> julia> unique(foos) >>>>>> 1-element Array{Foo,1}: >>>>>> Foo(4) >>>>>> >>>>>> julia> unique(foos)[1] == unique(foos)[2] >>>>>> ERROR: BoundsError: attempt to access 1-element Array{Foo,1}: >>>>>> Foo(4) >>>>>> at index [2] >>>>>> in getindex at array.jl:292 >>>>>> >>>>>> >>>>>> >>>>>> On Thursday, July 16, 2015 at 9:36:21 AM UTC-4, Stefan Karpinski >>>>>> wrote: >>>>>>> >>>>>>> You need to also define a hash method for this type. >>>>>>> >>>>>>> >>>>>>> On Jul 16, 2015, at 9:16 AM, Marc Gallant <marc.j....@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>> The unique function doesn't appear to work using iterables of custom >>>>>>> composite types, e.g., >>>>>>> >>>>>>> julia> type Foo >>>>>>> x::Int >>>>>>> end >>>>>>> >>>>>>> julia> import Base: == >>>>>>> >>>>>>> julia> ==(f1::Foo, f2::Foo) = f1.x == f2.x >>>>>>> == (generic function with 85 methods) >>>>>>> >>>>>>> julia> unique(foos) >>>>>>> 2-element Array{Foo,1}: >>>>>>> Foo(4) >>>>>>> Foo(4) >>>>>>> >>>>>>> julia> unique(foos)[1] == unique(foos)[2] >>>>>>> true >>>>>>> >>>>>>> >>>>>>> Is this the intended behaviour? >>>>>>> >>>>>>> >>>>> >>