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