Project

General

Profile

Bug #9882

Issue with hash string keys

Added by toommen (Tim Oommen) over 5 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
2.1.1p76
[ruby-core:62842]

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.


Related issues

Has duplicate Ruby master - Bug #9883: Different behaviour between `==` and hash key lookup regarding multibyte character fragmentClosed05/30/2014Actions

Associated revisions

Revision 950508e9
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46243 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 46243
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

Revision 46243
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

Revision 46243
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

Revision 46243
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

Revision 46243
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

Revision 46243
Added by nobu (Nobuyoshi Nakada) over 5 years ago

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]

Revision b901b875
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46244 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 46244
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

Revision 46244
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

Revision 46244
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

Revision 46244
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

Revision 46244
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

Revision 46244
Added by nobu (Nobuyoshi Nakada) over 5 years ago

test_string.rb: move and add assertions

  • test/ruby/test_string.rb (test_slice): move the assertion for [Bug #9882], and more assertion for ascii_only? too, as pointed out by Heesob Park in [ruby-core:62846].

Revision 08e698d4
Added by usa (Usaku NAKAMURA) over 5 years ago

merge revision(s) 46243,46244: [Backport #9882] [Backport #9883]

    * string.c (rb_str_substr): need to reset code range for shared
      string too, not only copied string.
      [ruby-core:62842] [Bug #9882]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@46584 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 46584
Added by usa (Usaku NAKAMURA) over 5 years ago

merge revision(s) 46243,46244: [Backport #9882] [Backport #9883]

* string.c (rb_str_substr): need to reset code range for shared
  string too, not only copied string.
  [ruby-core:62842] [Bug #9882]

Revision 108828f6
Added by nagachika (Tomoyuki Chikanaga) over 5 years ago

merge revision(s) r46243,r46244: [Backport #9882] [Backport #9883]

    * string.c (rb_str_substr): need to reset code range for shared
      string too, not only copied string.
      [ruby-core:62842] [Bug #9882]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@46599 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 46599
Added by nagachika (Tomoyuki Chikanaga) over 5 years ago

merge revision(s) r46243,r46244: [Backport #9882] [Backport #9883]

* string.c (rb_str_substr): need to reset code range for shared
  string too, not only copied string.
  [ruby-core:62842] [Bug #9882]

History

Updated by normalperson (Eric Wong) over 5 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 5 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 5 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 5 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 5 years ago

  • Has duplicate Bug #9883: Different behaviour between `==` and hash key lookup regarding multibyte character fragment added

Updated by usa (Usaku NAKAMURA) over 5 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 5 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.

Also available in: Atom PDF