From 898b4aa2a54a2325e0416fb0cac2d72608368db0 Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Tue, 13 May 2014 11:30:12 -0400 Subject: [PATCH] lib/standard/string: Fixed implementation of hash function for Text variants. Signed-off-by: Lucas Bajolet --- lib/standard/string.nit | 17 ++++++----------- tests/sav/test_hash_text.res | 8 ++++++++ tests/test_hash_text.nit | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 tests/sav/test_hash_text.res create mode 100644 tests/test_hash_text.nit diff --git a/lib/standard/string.nit b/lib/standard/string.nit index d09aadc..8531476 100644 --- a/lib/standard/string.nit +++ b/lib/standard/string.nit @@ -532,11 +532,9 @@ abstract class Text if hash_cache == null then # djb2 hash algorithm var h = 5381 - var i = length - 1 for char in self.chars do - h = (h * 32) + h + char.ascii - i -= 1 + h = h.lshift(5) + h + char.ascii end hash_cache = h @@ -862,18 +860,15 @@ class FlatString redef fun hash do if hash_cache == null then - # djb2 hash algorythm + # djb2 hash algorithm var h = 5381 - var i = length - 1 + var i = index_from var myitems = items - var strStart = index_from - - i += strStart - while i >= strStart do - h = (h * 32) + h + self.items[i].ascii - i -= 1 + while i <= index_to do + h = h.lshift(5) + h + myitems[i].ascii + i += 1 end hash_cache = h diff --git a/tests/sav/test_hash_text.res b/tests/sav/test_hash_text.res new file mode 100644 index 0000000..310e632 --- /dev/null +++ b/tests/sav/test_hash_text.res @@ -0,0 +1,8 @@ +true +true +true +true +true +true +true +true diff --git a/tests/test_hash_text.nit b/tests/test_hash_text.nit new file mode 100644 index 0000000..e655dd8 --- /dev/null +++ b/tests/test_hash_text.nit @@ -0,0 +1,32 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +var x = "string__NativeString__to_s_with_length" + +var y = "string" + "__" + "NativeString" + "__" + "to_s_with_length" + +var z = new FlatBuffer.from("string") + "__" + "NativeString" + "__" + "to_s_with_length" + +var a = ["string", "NativeString", "to_s_with_length"].join("__") + +print x.hash == y.hash +print y.hash == z.hash +print z.hash == a.hash +print a.hash == x.hash + +print x.substring(8,12).hash == y.substring(8,12).hash +print y.substring(8,12).hash == z.substring(8,12).hash +print z.substring(8,12).hash == a.substring(8,12).hash +print a.substring(8,12).hash == x.substring(8,12).hash + -- 1.7.9.5