Bug #9882
closedIssue with hash string keys
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.
Updated by normalperson (Eric Wong) over 10 years ago
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.
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- 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
Updated by phasis68 (Heesob Park) over 10 years ago
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
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- 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]
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Has duplicate Bug #9883: Different behaviour between `==` and hash key lookup regarding multibyte character fragment added
Updated by usa (Usaku NAKAMURA) over 10 years ago
- 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.
Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
- 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.