Ну вы же понимаете, наверное, что в приведенном вами коде indexOf и substring кушают раз в 100 больше времени, чем поиск свойства?
А с учетом количества их вызовов...
Вот вам другой простенький тест.
(хотя тут генерация ключа более-менее жручая)

Код AS3:
package
{
import flash.display.Sprite;
public class test2 extends Sprite
{
private static const NUM_KEYS:int = 150000;
private var _hash:Object = {};
public function test2()
{
fill();
check();
}
private function check():void
{
for(var i : int = 0; i < NUM_KEYS; i++) {
var key:String = generateKey();
if(key in _hash) {
trace("bingo! " + key + " exist");
}
}
}
private function fill():void
{
for(var i : int = 0; i < NUM_KEYS; i++) {
var key:String = generateKey();
_hash[key] = true;
}
}
private function generateKey():String
{
var key:String = "";
for(var i : int = 0; i < 3; i++) {
key += int(Math.random() * 100);
}
return key;
}
}
}