
Код AS3:
import flash.utils.Proxy;
import flash.utils.flash_proxy;
internal dynamic final class AlphaProps extends Proxy
{
public function get token():String
{
if (_needHashRegen)
{
_hash = hash(toString().replace(/\W+/g, ""));
_needHashRegen = false;
}
return _hash;
}
private var _keys:Array = [];
private var _props:Object = { };
private var _needHashRegen:Boolean;
private var _hash:String;
public function AlphaProps() { super(); }
public function toString():String
{
var r:String = "";
for (var p:String in this) r += p + "=\"" + this[p] + "\" ";
return r;
}
override flash_proxy function getProperty(name:*):* { return _props[name]; }
override flash_proxy function setProperty(name:*, value:*):void
{
_needHashRegen = true;
_keys.push(name);
_keys.sort();
_props[name] = value;
}
override flash_proxy function nextName(index:int):String { return _keys[index - 1]; }
override flash_proxy function nextNameIndex(index:int):int
{
if (_keys.length > index) return index + 1;
return 0;
}
override flash_proxy function nextValue(index:int):* { return _props[_keys[index]]; }
private static function hash(input:String):String
{
while (input.length % 8) input += "z";
var ilt:int = input.length;
var chklt:int = ilt / 8;
if (chklt > 31) throw new Error("Input to long.");
var arr:Array = [];
var wlt:int;
var wsum:int;
var i:int;
var ix:int;
var rs:String = "";
var p:String;
while (arr.length < 8)
{
arr.push(input.substr(chklt * arr.length, chklt));
}
for (ix = 0; ix < 8; ix++)
{
p = arr[ix];
wlt = p.length;
wsum = 0;
i = 0;
while (i < chklt)
{
wsum += p.charCodeAt(i);
wsum += wsum % p.charCodeAt(i);
i++;
}
rs = wsum.toString(32);
while (rs.length < 3) rs = "0" + rs;
arr[ix] = wlt.toString(32) + rs;
}
return arr.join("");
}
}
Собстенно, интересует ваше мнение по поводу private static function hash(input:String):String. На сколько ее можо считать надежной? Т.е. она не нужна для какой-то защиты / безопасности и т.п. просто нужен простой способ сравнить 2 динамических объекта на предмет наличия у них одинаковых свойств (свойства всегда будут иметь только строковые значения, и вряд ли их будет очень много, 50 - уже заоблачная цифра), соответственно, и имена свойств не располагают к наличию таких колизий... просто не хочется что-то очень заумное писать...
Да, и если есть вариант генерить ключи по-короче - было бы здорово
