The Inbox: Collections-cbc.810.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Collections-cbc.810.mcz

commits-2
Chris Cunningham uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-cbc.810.mcz

==================== Summary ====================

Name: Collections-cbc.810
Author: cbc
Time: 28 October 2018, 5:15:56.960512 pm
UUID: 729c4dd2-f677-3c40-9ded-4a407a71f824
Ancestors: Collections-topa.809

Do NOT move to trunk!
Various option for fixing the internval hash issue related to collectionsTests cbc.296.

Some explanation to go to mailing list - this is so interested folks can try out the code.

=============== Diff against Collections-topa.809 ===============

Item was added:
+ ----- Method: Array>>hashBetterFastIntervalCompatible (in category 'comparing') -----
+ hashBetterFastIntervalCompatible
+ | hash |
+ self size < 48 ifTrue: [^super hash]. "Just check every element."
+ hash := self species hash.
+ 1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+ self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+ ^(hash + self size hash) hashMultiply!

Item was added:
+ ----- Method: Array>>hashFastIntervalCompatible (in category 'comparing') -----
+ hashFastIntervalCompatible
+ self size = 0 ifTrue: [^self species hash].
+ ^(self species hash +
+ (((((self at: 1) hash bitShift: 2)
+ bitOr: (self at: self size) hash)
+ bitShift: 1)
+ bitOr: self size)
+ ) hashMultiply!

Item was changed:
  ----- Method: Interval>>hash (in category 'comparing') -----
  hash
  "Hash is reimplemented because = is implemented."
 
  ^(((start hash bitShift: 2)
  bitOr: stop hash)
  bitShift: 1)
  bitOr: self size!

Item was added:
+ ----- Method: Interval>>hashBetter (in category 'comparing') -----
+ hashBetter
+ "Hash is reimplemented because = is implemented."
+
+ ^(((start hash bitShift: 2)
+ bitOr: self last hash)
+ bitShift: 1)
+ bitOr: self size!

Item was added:
+ ----- Method: Interval>>hashBetterAlsoFixBug3380 (in category 'comparing') -----
+ hashBetterAlsoFixBug3380
+ "Hash is reimplemented because = is implemented."
+ "Altered so that we has the same as self asArray hash"
+ ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!

Item was added:
+ ----- Method: Interval>>hashBetterFastArrayCompatible (in category 'comparing') -----
+ hashBetterFastArrayCompatible
+ | hash |
+ self size < 48 ifTrue: [^self slowHash]. "Just check every element."
+ hash := Array hash.
+ 1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+ self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+ ^(hash + self size hash) hashMultiply!

Item was added:
+ ----- Method: Interval>>hashFastArrayCompatible (in category 'comparing') -----
+ hashFastArrayCompatible
+ "Hash is reimplemented because = is implemented."
+ self size = 0 ifTrue: [^Array hash].
+ ^(Array hash +
+ ((((start hash bitShift: 2)
+ bitOr: self last hash)
+ bitShift: 1)
+ bitOr: self size)
+ ) hashMultiply!

Item was added:
+ ----- Method: Interval>>hashSlowerBetterAlsoFixBug3380 (in category 'comparing') -----
+ hashSlowerBetterAlsoFixBug3380
+ "Hash is reimplemented because = is implemented."
+ "Altered so that we has the same as self asArray hash"
+ | hash |
+
+ hash := Array hash.
+ 1 to: self size do: [:i | hash := (hash + (self at: i) hash) hashMultiply].
+ ^hash!

Item was added:
+ ----- Method: Interval>>slowHash (in category 'comparing') -----
+ slowHash
+ "Hash is reimplemented because = is implemented."
+ "Altered so that we has the same as self asArray hash"
+ ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Collections-cbc.810.mcz

Nicolas Cellier
Is Interval = Array such an important feature?
My opinion now is that we should rather abandon it.

Le lun. 29 oct. 2018 à 01:16, <[hidden email]> a écrit :
Chris Cunningham uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-cbc.810.mcz

==================== Summary ====================

Name: Collections-cbc.810
Author: cbc
Time: 28 October 2018, 5:15:56.960512 pm
UUID: 729c4dd2-f677-3c40-9ded-4a407a71f824
Ancestors: Collections-topa.809

Do NOT move to trunk!
Various option for fixing the internval hash issue related to collectionsTests cbc.296.

Some explanation to go to mailing list - this is so interested folks can try out the code.

=============== Diff against Collections-topa.809 ===============

Item was added:
+ ----- Method: Array>>hashBetterFastIntervalCompatible (in category 'comparing') -----
+ hashBetterFastIntervalCompatible
+       | hash |
+       self size < 48 ifTrue: [^super hash]. "Just check every element."
+       hash := self species hash.
+       1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       ^(hash + self size hash) hashMultiply!

Item was added:
+ ----- Method: Array>>hashFastIntervalCompatible (in category 'comparing') -----
+ hashFastIntervalCompatible
+       self size = 0 ifTrue: [^self species hash].
+       ^(self species hash +
+               (((((self at: 1) hash bitShift: 2)
+                       bitOr: (self at: self size) hash)
+                       bitShift: 1)
+                       bitOr: self size)
+               ) hashMultiply!

Item was changed:
  ----- Method: Interval>>hash (in category 'comparing') -----
  hash
        "Hash is reimplemented because = is implemented."

        ^(((start hash bitShift: 2)
                bitOr: stop hash)
                bitShift: 1)
                bitOr: self size!

Item was added:
+ ----- Method: Interval>>hashBetter (in category 'comparing') -----
+ hashBetter
+       "Hash is reimplemented because = is implemented."
+
+       ^(((start hash bitShift: 2)
+               bitOr: self last hash)
+               bitShift: 1)
+               bitOr: self size!

Item was added:
+ ----- Method: Interval>>hashBetterAlsoFixBug3380 (in category 'comparing') -----
+ hashBetterAlsoFixBug3380
+       "Hash is reimplemented because = is implemented."
+       "Altered so that we has the same as self asArray hash"
+       ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!

Item was added:
+ ----- Method: Interval>>hashBetterFastArrayCompatible (in category 'comparing') -----
+ hashBetterFastArrayCompatible
+       | hash |
+       self size < 48 ifTrue: [^self slowHash]. "Just check every element."
+       hash := Array hash.
+       1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       ^(hash + self size hash) hashMultiply!

Item was added:
+ ----- Method: Interval>>hashFastArrayCompatible (in category 'comparing') -----
+ hashFastArrayCompatible
+       "Hash is reimplemented because = is implemented."
+       self size = 0 ifTrue: [^Array hash].
+       ^(Array hash +
+               ((((start hash bitShift: 2)
+                       bitOr: self last hash)
+                       bitShift: 1)
+                       bitOr: self size)
+               ) hashMultiply!

Item was added:
+ ----- Method: Interval>>hashSlowerBetterAlsoFixBug3380 (in category 'comparing') -----
+ hashSlowerBetterAlsoFixBug3380
+       "Hash is reimplemented because = is implemented."
+       "Altered so that we has the same as self asArray hash"
+       | hash |
+
+       hash := Array hash.
+       1 to: self size do: [:i | hash := (hash + (self at: i) hash) hashMultiply].
+       ^hash!

Item was added:
+ ----- Method: Interval>>slowHash (in category 'comparing') -----
+ slowHash
+       "Hash is reimplemented because = is implemented."
+       "Altered so that we has the same as self asArray hash"
+       ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!




Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Collections-cbc.810.mcz

Eliot Miranda-2


On Mon, Oct 29, 2018 at 12:36 PM Nicolas Cellier <[hidden email]> wrote:
Is Interval = Array such an important feature?
My opinion now is that we should rather abandon it.

+1
 

Le lun. 29 oct. 2018 à 01:16, <[hidden email]> a écrit :
Chris Cunningham uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-cbc.810.mcz

==================== Summary ====================

Name: Collections-cbc.810
Author: cbc
Time: 28 October 2018, 5:15:56.960512 pm
UUID: 729c4dd2-f677-3c40-9ded-4a407a71f824
Ancestors: Collections-topa.809

Do NOT move to trunk!
Various option for fixing the internval hash issue related to collectionsTests cbc.296.

Some explanation to go to mailing list - this is so interested folks can try out the code.

=============== Diff against Collections-topa.809 ===============

Item was added:
+ ----- Method: Array>>hashBetterFastIntervalCompatible (in category 'comparing') -----
+ hashBetterFastIntervalCompatible
+       | hash |
+       self size < 48 ifTrue: [^super hash]. "Just check every element."
+       hash := self species hash.
+       1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       ^(hash + self size hash) hashMultiply!

Item was added:
+ ----- Method: Array>>hashFastIntervalCompatible (in category 'comparing') -----
+ hashFastIntervalCompatible
+       self size = 0 ifTrue: [^self species hash].
+       ^(self species hash +
+               (((((self at: 1) hash bitShift: 2)
+                       bitOr: (self at: self size) hash)
+                       bitShift: 1)
+                       bitOr: self size)
+               ) hashMultiply!

Item was changed:
  ----- Method: Interval>>hash (in category 'comparing') -----
  hash
        "Hash is reimplemented because = is implemented."

        ^(((start hash bitShift: 2)
                bitOr: stop hash)
                bitShift: 1)
                bitOr: self size!

Item was added:
+ ----- Method: Interval>>hashBetter (in category 'comparing') -----
+ hashBetter
+       "Hash is reimplemented because = is implemented."
+
+       ^(((start hash bitShift: 2)
+               bitOr: self last hash)
+               bitShift: 1)
+               bitOr: self size!

Item was added:
+ ----- Method: Interval>>hashBetterAlsoFixBug3380 (in category 'comparing') -----
+ hashBetterAlsoFixBug3380
+       "Hash is reimplemented because = is implemented."
+       "Altered so that we has the same as self asArray hash"
+       ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!

Item was added:
+ ----- Method: Interval>>hashBetterFastArrayCompatible (in category 'comparing') -----
+ hashBetterFastArrayCompatible
+       | hash |
+       self size < 48 ifTrue: [^self slowHash]. "Just check every element."
+       hash := Array hash.
+       1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
+       ^(hash + self size hash) hashMultiply!

Item was added:
+ ----- Method: Interval>>hashFastArrayCompatible (in category 'comparing') -----
+ hashFastArrayCompatible
+       "Hash is reimplemented because = is implemented."
+       self size = 0 ifTrue: [^Array hash].
+       ^(Array hash +
+               ((((start hash bitShift: 2)
+                       bitOr: self last hash)
+                       bitShift: 1)
+                       bitOr: self size)
+               ) hashMultiply!

Item was added:
+ ----- Method: Interval>>hashSlowerBetterAlsoFixBug3380 (in category 'comparing') -----
+ hashSlowerBetterAlsoFixBug3380
+       "Hash is reimplemented because = is implemented."
+       "Altered so that we has the same as self asArray hash"
+       | hash |
+
+       hash := Array hash.
+       1 to: self size do: [:i | hash := (hash + (self at: i) hash) hashMultiply].
+       ^hash!

Item was added:
+ ----- Method: Interval>>slowHash (in category 'comparing') -----
+ slowHash
+       "Hash is reimplemented because = is implemented."
+       "Altered so that we has the same as self asArray hash"
+       ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!





--
_,,,^..^,,,_
best, Eliot


Reply | Threaded
Open this post in threaded view
|

Re: The Inbox: Collections-cbc.810.mcz

Chris Muller-3
In reply to this post by commits-2
Good finds and also this analysis of trade-off implementations for
Interval>>#hash!  I definitely don't understand the implications of
each ("size - 15"?), but this cool try-it-out package enables a level
of collaboration that almost brings a tear to my eye.  Awesome.

Thanks Chris.  :)


On Sun, Oct 28, 2018 at 7:16 PM <[hidden email]> wrote:

>
> Chris Cunningham uploaded a new version of Collections to project The Inbox:
> http://source.squeak.org/inbox/Collections-cbc.810.mcz
>
> ==================== Summary ====================
>
> Name: Collections-cbc.810
> Author: cbc
> Time: 28 October 2018, 5:15:56.960512 pm
> UUID: 729c4dd2-f677-3c40-9ded-4a407a71f824
> Ancestors: Collections-topa.809
>
> Do NOT move to trunk!
> Various option for fixing the internval hash issue related to collectionsTests cbc.296.
>
> Some explanation to go to mailing list - this is so interested folks can try out the code.
>
> =============== Diff against Collections-topa.809 ===============
>
> Item was added:
> + ----- Method: Array>>hashBetterFastIntervalCompatible (in category 'comparing') -----
> + hashBetterFastIntervalCompatible
> +       | hash |
> +       self size < 48 ifTrue: [^super hash]. "Just check every element."
> +       hash := self species hash.
> +       1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
> +       self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
> +       ^(hash + self size hash) hashMultiply!
>
> Item was added:
> + ----- Method: Array>>hashFastIntervalCompatible (in category 'comparing') -----
> + hashFastIntervalCompatible
> +       self size = 0 ifTrue: [^self species hash].
> +       ^(self species hash +
> +               (((((self at: 1) hash bitShift: 2)
> +                       bitOr: (self at: self size) hash)
> +                       bitShift: 1)
> +                       bitOr: self size)
> +               ) hashMultiply!
>
> Item was changed:
>   ----- Method: Interval>>hash (in category 'comparing') -----
>   hash
>         "Hash is reimplemented because = is implemented."
>
>         ^(((start hash bitShift: 2)
>                 bitOr: stop hash)
>                 bitShift: 1)
>                 bitOr: self size!
>
> Item was added:
> + ----- Method: Interval>>hashBetter (in category 'comparing') -----
> + hashBetter
> +       "Hash is reimplemented because = is implemented."
> +
> +       ^(((start hash bitShift: 2)
> +               bitOr: self last hash)
> +               bitShift: 1)
> +               bitOr: self size!
>
> Item was added:
> + ----- Method: Interval>>hashBetterAlsoFixBug3380 (in category 'comparing') -----
> + hashBetterAlsoFixBug3380
> +       "Hash is reimplemented because = is implemented."
> +       "Altered so that we has the same as self asArray hash"
> +       ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!
>
> Item was added:
> + ----- Method: Interval>>hashBetterFastArrayCompatible (in category 'comparing') -----
> + hashBetterFastArrayCompatible
> +       | hash |
> +       self size < 48 ifTrue: [^self slowHash]. "Just check every element."
> +       hash := Array hash.
> +       1 to: 16 do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
> +       self size - 15 to: self size do: [:i| hash := (hash + (self at: i) hash) hashMultiply].
> +       ^(hash + self size hash) hashMultiply!
>
> Item was added:
> + ----- Method: Interval>>hashFastArrayCompatible (in category 'comparing') -----
> + hashFastArrayCompatible
> +       "Hash is reimplemented because = is implemented."
> +       self size = 0 ifTrue: [^Array hash].
> +       ^(Array hash +
> +               ((((start hash bitShift: 2)
> +                       bitOr: self last hash)
> +                       bitShift: 1)
> +                       bitOr: self size)
> +               ) hashMultiply!
>
> Item was added:
> + ----- Method: Interval>>hashSlowerBetterAlsoFixBug3380 (in category 'comparing') -----
> + hashSlowerBetterAlsoFixBug3380
> +       "Hash is reimplemented because = is implemented."
> +       "Altered so that we has the same as self asArray hash"
> +       | hash |
> +
> +       hash := Array hash.
> +       1 to: self size do: [:i | hash := (hash + (self at: i) hash) hashMultiply].
> +       ^hash!
>
> Item was added:
> + ----- Method: Interval>>slowHash (in category 'comparing') -----
> + slowHash
> +       "Hash is reimplemented because = is implemented."
> +       "Altered so that we has the same as self asArray hash"
> +       ^self inject: Array hash into: [:workingHash :each| (workingHash + each hash) hashMultiply ].!
>
>