Bug #9882
closed
Issue with hash string keys
Added by toommen (Tim Oommen) over 10 years ago.
Updated over 10 years ago.
Description
I have the following code. In a nutshell i am slicing a string to pull out strings to use as keys in a hash. However when running the following code, I am getting odd results.
context = "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
slice_url = context.slice(105,24)
str = "http://cnnmon.ie/1kcFZSQ"
slice_url == str
redirects = {"http://cnnmon.ie/1kcFZSQ"=>"http://money.cnn.com/2014/02/06/leadership/marriott-hotels.pr.fortune"}
redirects.key?(slice_url)
redirects.key?(str)
The slice_url
and str
are equal, however when I look for the key in redirects with slice_url
I get a nil
, but when setting the string variable manually, I get a match and value. I am not sure if this is an issue with the value returned by the string slice method or an issue with the hash.
tim@nexgate.com wrote:
I have the following code. In a nutshell i am slicing a string to pull out strings to use as keys in a hash. However when running the following code, I am getting odd results.
context = "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
The smart quote (’) character in context seems to have something to do
with it failing to match. Using a normal single quote ('), everything
works as expected.
Other than that, I'm puzzled, too. All strings show up as
Encoding::UTF-8 on my system.
- Description updated (diff)
- Category set to core
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED
This issue is due to the different result of String#hash of each string.
Why slice_url.hash != str.hash
in splite of slice_url == str
?
And I found the root cause is slice_url.ascii_only? != str.ascii_only?
C:\work>irb
irb(main):001:0> context = "Marriott International World’s Most ADMIRED Lodging
Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
=> "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for
14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
irb(main):002:0> slice_url = context.slice(105,24)
=> "http://cnnmon.ie/1kcFZSQ"
irb(main):003:0> str = "http://cnnmon.ie/1kcFZSQ"
=> "http://cnnmon.ie/1kcFZSQ"
irb(main):004:0> slice_url.hash
=> 1022346954
irb(main):005:0> str.hash
=> 1022346949
irb(main):006:0> slice_url.ascii_only?
=> false
irb(main):007:0> str.ascii_only?
=> true
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r46243.
string.c: reset code range
- string.c (rb_str_substr): need to reset code range for shared
string too, not only copied string.
[ruby-core:62842] [Bug #9882]
- Has duplicate Bug #9883: Different behaviour between `==` and hash key lookup regarding multibyte character fragment added
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: DONE, 2.1: REQUIRED
backported into ruby_2_0_0
at r46584.
- Backport changed from 2.0.0: DONE, 2.1: REQUIRED to 2.0.0: DONE, 2.1: DONE
Backported into ruby_2_1
branch at r46599.
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0