Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Упрощенная генерация воспроизводимых иникальных ключей (http://www.flasher.ru/forum/showthread.php?t=122763)

wvxvw 18.03.2009 04:19

Упрощенная генерация воспроизводимых уникальных ключей
 
Код 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 - уже заоблачная цифра), соответственно, и имена свойств не располагают к наличию таких колизий... просто не хочется что-то очень заумное писать...

Да, и если есть вариант генерить ключи по-короче - было бы здорово :)


Часовой пояс GMT +4, время: 17:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.