Index: trunk/src/lua/lua_map_area.cc
===================================================================
--- trunk/src/lua/lua_map_area.cc	(revision 426)
+++ trunk/src/lua/lua_map_area.cc	(revision 431)
@@ -137,5 +137,6 @@
 {
 	nv::map_area* ma = to_map_area( L, 1 );
-	lua_pushstring( L, ma->id_to_string( ma->get_cell( to_coord( L, 2 ) ) ).c_str() );
+	nv::string_view result( ma->id_to_string( ma->get_cell( to_coord( L, 2 ) ) ) );
+	lua_pushlstring( L, result.data(), result.size() );
 	return 1;
 }
Index: trunk/src/lua/lua_state.cc
===================================================================
--- trunk/src/lua/lua_state.cc	(revision 426)
+++ trunk/src/lua/lua_state.cc	(revision 431)
@@ -184,5 +184,5 @@
 }
 
-uint64 nv::lua::table_guard::get_string_hash_64( string_view element, uint64 defval /*= 0 */ )
+shash64 nv::lua::table_guard::get_string_hash_64( string_view element, uint64 defval /*= 0 */ )
 {
 	lua_getfield( m_state, -1, element.data() );
@@ -196,5 +196,20 @@
 	}
 	lua_pop( m_state, 1 );
-	return result;
+	return shash64( result );
+}
+
+shash64 nv::lua::table_guard::get_string( string_view element, string_table& table, uint64 defval /*= 0 */ )
+{
+	lua_getfield( m_state, -1, element.data() );
+	size_t l = 0;
+	const char* str = nullptr;
+	uint64 result = defval;
+	if ( lua_type( m_state, -1 ) == LUA_TSTRING )
+	{
+		str = lua_tolstring( m_state, -1, &l );
+		result = table.insert( string_view( str, l ) ).value();
+	}
+	lua_pop( m_state, 1 );
+	return shash64( result );
 }
 
