def test_hash_on_str_creation(self): # In cPython some? new strings do not have a cached hash until hash() is # called def impl(do_hash): const1 = "aaaa" const2 = "ую╝ую╝ую╝ую╝" new = const1 + const2 if do_hash: hash(new) return new jitted = jit(nopython=True)(impl) # do not compute the hash, cPython will have no cached hash, but Numba # will compute_hash = False expected = impl(compute_hash) got = jitted(compute_hash) a = (compile_time_get_string_data(expected)) b = (compile_time_get_string_data(got)) self.assertEqual(a[:-1], b[:-1]) self.assertTrue(a[-1] != b[-1]) # now with compute hash enabled, cPython will have a cached hash as will # Numba compute_hash = True expected = impl(compute_hash) got = jitted(compute_hash) a = (compile_time_get_string_data(expected)) b = (compile_time_get_string_data(got)) self.assertEqual(a, b)
def test_hash_literal(self): # a strconst always seem to have an associated hash value so the hash # member of the returned value should contain the correct hash @jit(nopython=True) def fn(): x = "abcdefghijklmnopqrstuvwxyz" return x val = fn() tmp = hash("abcdefghijklmnopqrstuvwxyz") self.assertEqual(tmp, (compile_time_get_string_data(val)[-1]))
def test_hash_passthrough_call(self): # check `x._hash` and hash(x) are the same kind1_string = "abcdefghijklmnopqrstuvwxyz" @jit(nopython=True) def fn(x): return x._hash, hash(x) hash_value = compile_time_get_string_data(kind1_string)[-1] self.assertTrue(hash_value != -1) self.assertEqual(fn(kind1_string), (hash_value, hash_value))
def test_hash_passthrough(self): # no `hash` call made, this just checks that `._hash` is correctly # passed through from an already existing string kind1_string = "abcdefghijklmnopqrstuvwxyz" @jit(nopython=True) def fn(x): return x._hash hash_value = compile_time_get_string_data(kind1_string)[-1] self.assertTrue(hash_value != -1) self.assertEqual(fn(kind1_string), hash_value)