Index: /trunk/nv/engine/particle_engine.hh
===================================================================
--- /trunk/nv/engine/particle_engine.hh	(revision 438)
+++ /trunk/nv/engine/particle_engine.hh	(revision 439)
@@ -165,10 +165,10 @@
 		void load( lua::table_guard& table );
 		void draw( particle_system system, const render_state& rs, const scene_state& ss );
-		particle_system create_system( const std::string& id );
+		particle_system create_system( const string_view& id );
 		void release( particle_system system );
 		void update( particle_system system, const scene_state& s, uint32 ms );
 		void set_texcoords( particle_system system, vec2 a, vec2 b );
-		void register_emmiter_type( const std::string& name, particle_emmiter_func func );
-		void register_affector_type( const std::string& name, particle_affector_init_func init, particle_affector_func process );
+		void register_emmiter_type( const string_view& name, particle_emmiter_func func );
+		void register_affector_type( const string_view& name, particle_affector_init_func init, particle_affector_func process );
 		~particle_engine();
 	private:
@@ -194,9 +194,9 @@
 		uint32   m_last_update;
 
-		handle_store< particle_system_info, particle_system >      m_systems;
-		unordered_map< std::string, uint32 >                  m_names;
+		handle_store< particle_system_info, particle_system > m_systems;
+		hash_store< shash64, uint32 >                         m_names;
 		vector< particle_system_data >                        m_data; 
-		unordered_map< std::string, particle_emmiter_func >   m_emmiters;
-		unordered_map< std::string, particle_affector_funcs > m_affectors;
+		hash_store< shash64, particle_emmiter_func >          m_emmiters;
+		hash_store< shash64, particle_affector_funcs >        m_affectors;
 	};
 
Index: /trunk/nv/gl/gl_device.hh
===================================================================
--- /trunk/nv/gl/gl_device.hh	(revision 438)
+++ /trunk/nv/gl/gl_device.hh	(revision 439)
@@ -54,10 +54,10 @@
 		virtual const buffer_info* get_buffer_info( buffer t ) const;
 
-		virtual int get_attribute_location( program p, const std::string& name, bool fatal = true ) const;
+		virtual int get_attribute_location( program p, const string_view& name, bool fatal = true ) const;
 		virtual void prepare_program( program p );
 		virtual string_view get_shader_header() const { return m_shader_header; }
 		virtual ~gl_device();
 	protected:
-		uniform_base* get_uniform( program p, const std::string& name, bool fatal = true ) const;
+		uniform_base* get_uniform( program p, const string_view& name, bool fatal = true ) const;
 
 	private:
Index: /trunk/nv/interface/device.hh
===================================================================
--- /trunk/nv/interface/device.hh	(revision 438)
+++ /trunk/nv/interface/device.hh	(revision 439)
@@ -17,4 +17,5 @@
 #include <nv/stl/string.hh>
 #include <nv/stl/handle.hh>
+#include <nv/stl/hash_store.hh>
 #include <nv/interface/uniform.hh>
 #include <nv/interface/mesh_data.hh>
@@ -68,5 +69,4 @@
 	struct attribute
 	{
-		std::string   name;
 		int      location;
 		datatype type;
@@ -74,5 +74,5 @@
 	};
 
-	typedef unordered_map< std::string, attribute >    attribute_map;
+	typedef hash_store< shash64, attribute >    attribute_map;
 
 	struct texture_tag {};
@@ -189,13 +189,13 @@
 		}
 
-		int try_get_attribute_location( program p, const std::string& name ) const
+		int try_get_attribute_location( program p, const string_view& name ) const
 		{
 			return get_attribute_location( p, name, false );
 		}
 
-		virtual int get_attribute_location( program p, const std::string& name, bool fatal = true ) const = 0;
-
-		template < typename T >
-		void set_uniform_array( program p, const std::string& name, const T* value, uint32 count, bool fatal = true )
+		virtual int get_attribute_location( program p, const string_view& name, bool fatal = true ) const = 0;
+
+		template < typename T >
+		void set_uniform_array( program p, const string_view& name, const T* value, uint32 count, bool fatal = true )
 		{
 			uniform_base* base = get_uniform( p, name, fatal );
@@ -212,5 +212,5 @@
 
 		template < typename T >
-		void set_opt_uniform_array( program p, const std::string& name, const T* value, uint32 count )
+		void set_opt_uniform_array( program p, const string_view& name, const T* value, uint32 count )
 		{
 			set_uniform_array( p, name, value, count, false );
@@ -218,5 +218,5 @@
 
 		template < typename T >
-		void set_opt_uniform_array( program p, const std::string& name, const array_view<T>& value )
+		void set_opt_uniform_array( program p, const string_view& name, const array_view<T>& value )
 		{
 			set_uniform_array( p, name, value.data(), value.size(), false );
@@ -225,5 +225,5 @@
 
 		template < typename T >
-		void set_uniform( program p, const std::string& name, const T& value, bool fatal = true )
+		void set_uniform( program p, const string_view& name, const T& value, bool fatal = true )
 		{
 			uniform_base* base = get_uniform( p, name, fatal );
@@ -238,5 +238,5 @@
 
 		template < typename T >
-		void set_opt_uniform( program p, const std::string& name, const T& value )
+		void set_opt_uniform( program p, const string_view& name, const T& value )
 		{
 			set_uniform( p, name, value, false );
@@ -265,5 +265,5 @@
 
 	protected:
-		virtual uniform_base* get_uniform( program p, const std::string& name, bool fatal = true ) const = 0;
+		virtual uniform_base* get_uniform( program p, const string_view& name, bool fatal = true ) const = 0;
 
 		void initialize_engine_uniforms()
Index: /trunk/nv/interface/uniform.hh
===================================================================
--- /trunk/nv/interface/uniform.hh	(revision 438)
+++ /trunk/nv/interface/uniform.hh	(revision 439)
@@ -17,4 +17,5 @@
 #include <nv/interface/camera.hh>
 #include <nv/stl/string.hh>
+#include <nv/stl/string_map.hh>
 #include <nv/stl/unordered_map.hh>
 
@@ -26,6 +27,6 @@
 	{
 	public: 
-		uniform_base( const std::string& name, datatype type, int location, int length ) 
-			: m_name( name ), m_type( type ), m_location(location), m_length( length ), m_dirty( true ) {}
+		uniform_base( datatype type, int location, int length ) 
+			: m_type( type ), m_location(location), m_length( length ), m_dirty( true ) {}
 		bool try_type_check( datatype )
 		{
@@ -44,8 +45,7 @@
 		bool is_dirty() const { return m_dirty; }
 		void clean() { m_dirty = false; }
-		static uniform_base* create( datatype utype, const std::string& name, int location, int length );
+		static uniform_base* create( datatype utype, int location, int length );
 		virtual ~uniform_base() {}
 	protected:
-		std::string   m_name;
 		datatype m_type;
 		int      m_location;
@@ -60,6 +60,6 @@
 		typedef T value_type;
 
-		uniform( const std::string& name, int location, int length ) 
-			: uniform_base( name, type_to_enum< T >::type, location, length ), m_value( nullptr )
+		uniform( int location, int length ) 
+			: uniform_base( type_to_enum< T >::type, location, length ), m_value( nullptr )
 		{
 			m_value = new T[ m_length ];
@@ -149,6 +149,8 @@
 	};
 
-	typedef nv::unordered_map< std::string, uniform_base* >                uniform_map;
-	typedef nv::vector< engine_uniform_base* >                        engine_uniform_list;
+	// TODO - nv::hash_store< shash64, uniform_base* >
+	typedef nv::string_map< uniform_base* >                uniform_map;
+	typedef nv::vector< engine_uniform_base* >             engine_uniform_list;
+
 	// TODO - change to literal type map
 	typedef nv::unordered_map< string_view, engine_uniform_factory_base* > engine_uniform_factory_map;
@@ -248,19 +250,19 @@
 	};
 
-	inline uniform_base* uniform_base::create( datatype utype, const std::string& name, int location, int length )
+	inline uniform_base* uniform_base::create( datatype utype, int location, int length )
 	{
 		switch( utype )
 		{
-		case FLOAT          : return new uniform< enum_to_type< FLOAT          >::type >( name, location, length );
-		case INT            : return new uniform< enum_to_type< INT            >::type >( name, location, length );
-		case FLOAT_VECTOR_2 : return new uniform< enum_to_type< FLOAT_VECTOR_2 >::type >( name, location, length );
-		case FLOAT_VECTOR_3 : return new uniform< enum_to_type< FLOAT_VECTOR_3 >::type >( name, location, length );
-		case FLOAT_VECTOR_4 : return new uniform< enum_to_type< FLOAT_VECTOR_4 >::type >( name, location, length );
-		case INT_VECTOR_2   : return new uniform< enum_to_type< INT_VECTOR_2   >::type >( name, location, length );
-		case INT_VECTOR_3   : return new uniform< enum_to_type< INT_VECTOR_3   >::type >( name, location, length );
-		case INT_VECTOR_4   : return new uniform< enum_to_type< INT_VECTOR_4   >::type >( name, location, length );
-		case FLOAT_MATRIX_2 : return new uniform< enum_to_type< FLOAT_MATRIX_2 >::type >( name, location, length );
-		case FLOAT_MATRIX_3 : return new uniform< enum_to_type< FLOAT_MATRIX_3 >::type >( name, location, length );
-		case FLOAT_MATRIX_4 : return new uniform< enum_to_type< FLOAT_MATRIX_4 >::type >( name, location, length );
+		case FLOAT          : return new uniform< enum_to_type< FLOAT          >::type >( location, length );
+		case INT            : return new uniform< enum_to_type< INT            >::type >( location, length );
+		case FLOAT_VECTOR_2 : return new uniform< enum_to_type< FLOAT_VECTOR_2 >::type >( location, length );
+		case FLOAT_VECTOR_3 : return new uniform< enum_to_type< FLOAT_VECTOR_3 >::type >( location, length );
+		case FLOAT_VECTOR_4 : return new uniform< enum_to_type< FLOAT_VECTOR_4 >::type >( location, length );
+		case INT_VECTOR_2   : return new uniform< enum_to_type< INT_VECTOR_2   >::type >( location, length );
+		case INT_VECTOR_3   : return new uniform< enum_to_type< INT_VECTOR_3   >::type >( location, length );
+		case INT_VECTOR_4   : return new uniform< enum_to_type< INT_VECTOR_4   >::type >( location, length );
+		case FLOAT_MATRIX_2 : return new uniform< enum_to_type< FLOAT_MATRIX_2 >::type >( location, length );
+		case FLOAT_MATRIX_3 : return new uniform< enum_to_type< FLOAT_MATRIX_3 >::type >( location, length );
+		case FLOAT_MATRIX_4 : return new uniform< enum_to_type< FLOAT_MATRIX_4 >::type >( location, length );
 		default     : return nullptr;
 		}
Index: /trunk/src/engine/particle_engine.cc
===================================================================
--- /trunk/src/engine/particle_engine.cc	(revision 438)
+++ /trunk/src/engine/particle_engine.cc	(revision 439)
@@ -302,6 +302,6 @@
 void nv::particle_engine::load( lua::table_guard& table )
 {
-	std::string id = table.get_std_string( "id" );
-	if ( id == "" )
+	shash64 id = table.get_string_hash_64( "id" );
+	if ( !id.valid() )
 	{
 		NV_LOG_ERROR( "Bad table passed to particle_engine!" )
@@ -355,6 +355,6 @@
 	{
 		lua::table_guard element( table, i+1 );
-		const_string type     = element.get_string("type");
-		std::string sub_type = element.get_std_string("sub_type");
+		const_string type     = element.get_string( "type" );
+		const_string sub_type = element.get_string( "sub_type" );
 		if ( type == "emmiter" )
 		{
@@ -370,5 +370,5 @@
 				{
 					edata.emmiter_func = nv_particle_emmiter_point;
-					NV_LOG_WARNING( "Unknown emmiter type in particle system! (", sub_type.c_str(), ")" );
+					NV_LOG_WARNING( "Unknown emmiter type in particle system! (", sub_type, ")" );
 				}
 
@@ -435,5 +435,5 @@
 					{
 						data.affector_count--;
-						NV_LOG_WARNING( "Bad data passed to ", string_view( sub_type.c_str(), sub_type.size() ), " affector in particle system!" );
+						NV_LOG_WARNING( "Bad data passed to ", sub_type, " affector in particle system!" );
 					}
 				}
@@ -441,5 +441,5 @@
 				{
 					data.affector_count--;
-					NV_LOG_WARNING( "Unknown affector type in particle system! (", string_view( sub_type.c_str(), sub_type.size() ), ")" );
+					NV_LOG_WARNING( "Unknown affector type in particle system! (", sub_type, ")" );
 				}
 			}
@@ -469,5 +469,5 @@
 }
 
-nv::particle_system nv::particle_engine::create_system( const std::string& id )
+nv::particle_system nv::particle_engine::create_system( const string_view& id )
 {
 	auto it = m_names.find( id );
@@ -823,5 +823,5 @@
 }
 
-void nv::particle_engine::register_emmiter_type( const std::string& name, particle_emmiter_func func )
+void nv::particle_engine::register_emmiter_type( const string_view& name, particle_emmiter_func func )
 {
 	m_emmiters[ name ] = func;
@@ -842,5 +842,5 @@
 }
 
-void nv::particle_engine::register_affector_type( const std::string& name, particle_affector_init_func init, particle_affector_func process )
+void nv::particle_engine::register_affector_type( const string_view& name, particle_affector_init_func init, particle_affector_func process )
 {
 	m_affectors[ name ].init    = init;
Index: /trunk/src/gl/gl_device.cc
===================================================================
--- /trunk/src/gl/gl_device.cc	(revision 438)
+++ /trunk/src/gl/gl_device.cc	(revision 439)
@@ -212,5 +212,5 @@
 		for ( auto& i : *info->m_uniform_map )
 		{
-			auto j = lmap.find( i.first.c_str() );
+			auto j = lmap.find( i.first );
 			if ( j != lmap.end() )
 			{
@@ -218,5 +218,5 @@
 			}			
 
-			auto k = map.find( i.first.c_str() );
+			auto k = map.find( i.first );
 			if ( k != map.end() )
 			{
@@ -227,5 +227,5 @@
 }
 
-uniform_base* nv::gl_device::get_uniform( program p, const std::string& name, bool fatal /*= true */ ) const
+uniform_base* nv::gl_device::get_uniform( program p, const string_view& name, bool fatal /*= true */ ) const
 {
 	const gl_program_info* info = m_programs.get( p );
@@ -238,5 +238,5 @@
 		if ( fatal )
 		{
-			NV_LOG_CRITICAL( "gl_device : uniform '", string_view( name.c_str(), name.size() ), "' not found in program!" );
+			NV_LOG_CRITICAL( "gl_device : uniform '", name, "' not found in program!" );
 			NV_ABORT( "gl_device : uniform not found!" );
 		}
@@ -245,5 +245,5 @@
 }
 
-int nv::gl_device::get_attribute_location( program p, const std::string& name, bool fatal /*= true */ ) const
+int nv::gl_device::get_attribute_location( program p, const string_view& name, bool fatal /*= true */ ) const
 {
 	const gl_program_info* info = m_programs.get( p );
@@ -257,5 +257,5 @@
 		if ( fatal )
 		{
-			NV_LOG_CRITICAL( "gl_device : attribute '", string_view( name.c_str(), name.size() ), "' not found in program!" );
+			NV_LOG_CRITICAL( "gl_device : attribute '", name, "' not found in program!" );
 			NV_ABORT( "gl_device : attribute not found!" );
 		}
@@ -357,13 +357,12 @@
 		glGetActiveAttrib( p->glid, i, 128, &attr_nlen, &attr_len, &attr_type, name_buffer );
 
-		std::string name( name_buffer, size_t( attr_nlen ) );
+		string_view name( name_buffer, size_t( attr_nlen ) );
 
 		// skip built-ins
 		if ( name.substr(0,3) == "gl_" ) continue;
 
-		int attr_loc = glGetAttribLocation( p->glid, name.c_str() );
+		int attr_loc = glGetAttribLocation( p->glid, name.data() );
 
 		attribute& attr = (*p->m_attribute_map)[ name ];
-		attr.name     = name;
 		attr.location = attr_loc;
 		attr.type     = gl_enum_to_datatype( attr_type );
@@ -386,20 +385,20 @@
 		glGetActiveUniform( p->glid, i, 128, &uni_nlen, &uni_len, &uni_type, name_buffer );
 
-		std::string name( name_buffer, size_t( uni_nlen ) );
+		string_view name( name_buffer, size_t( uni_nlen ) );
 
 		// skip built-ins
 		if ( name.substr(0,3) == "gl_" ) continue;
 
-		int uni_loc = glGetUniformLocation( p->glid, name.c_str() );
+		int uni_loc = glGetUniformLocation( p->glid, name.data() );
 		datatype utype = gl_enum_to_datatype( uni_type );
 
 		// check for array
-		std::string::size_type arrchar = name.find( '[' );
-		if ( arrchar != std::string::npos )
+		size_t arrchar = name.find( '[' );
+		if ( arrchar != string_view::npos )
 		{
 			name = name.substr( 0, arrchar );
 		}
 
-		uniform_base* u = uniform_base::create( utype, name, uni_loc, uni_len );
+		uniform_base* u = uniform_base::create( utype, uni_loc, uni_len );
 		NV_ASSERT( u, "Unknown uniform type!" );
 		(*p->m_uniform_map)[ name ] = u;
