Actionscript 3 算法:实现基于dict的自定义哈希表

Actionscript 3 算法:实现基于dict的自定义哈希表,actionscript-3,algorithm,cryptography,Actionscript 3,Algorithm,Cryptography,我正在学习编程抽象数据类型。正在尝试基于dict构建自定义哈希表 到目前为止,我已经创建了一个班级占位符 public class HashMapDict implements IDict { private var _map:Array; public function HashMapDict() { _map = new Array(); //TODO: implement function } public

我正在学习编程抽象数据类型。正在尝试基于dict构建自定义哈希表

到目前为止,我已经创建了一个班级占位符

    public class HashMapDict implements IDict
{
    private var _map:Array;
    public function HashMapDict()
    {
        _map = new Array();

        //TODO: implement function
    }

    public function set(keys:Array):Boolean
    {
        // 1. For each key in array of keys
        // 2. Pass Key.key to hash function
        // 3. Write Key to _map[hash(Key.key)]
        return true;
    }


}
我看到主方法集执行以下操作

// 1. For each key in array of keys
// 2. Pass Key.key to hash function
// 3. Write Key to _map[hash(Key.key)]
我考虑的是使用加密libs生成散列。但我对它应该如何工作有点困惑。e、 g.试着看几个像as3crypto这样的LIB(http://crypto.hurlant.com/demo/)它似乎以一种我并不认为可以用于数组中索引的方式生成哈希

例如


您能建议我使用哪个库来生成可用的哈希吗?它们应该是什么样子呢?我可能遗漏了什么,但我想你应该看看
flash.utils::Dictionary

它使散列变得过时。如果您必须具有某种基本密钥,我建议使用以下方法:

class UIDUtil {
    static private var map:Dictionary = new Dictionary(true);
    static private var counter:int = 0;
    static public function getUID(value:*):int {
         return map[value] ||= counter++;
    }
}
但是你的类I将实现为:

public class HashMapDict implements IDict {
    private var _map:Dictionary = new Dictionary();
    public function set(keys:Array):Boolean {
        for each (var key:* in keys) _map[key] = key;
        return true;
    }
}

但我不确定它的目的;)

我可能遗漏了什么,但我想你应该看看
flash.utils::Dictionary

它使散列变得过时。如果您必须具有某种基本密钥,我建议使用以下方法:

class UIDUtil {
    static private var map:Dictionary = new Dictionary(true);
    static private var counter:int = 0;
    static public function getUID(value:*):int {
         return map[value] ||= counter++;
    }
}
但是你的类I将实现为:

public class HashMapDict implements IDict {
    private var _map:Dictionary = new Dictionary();
    public function set(keys:Array):Boolean {
        for each (var key:* in keys) _map[key] = key;
        return true;
    }
}
但我不确定它的目的;)

作为一个提醒——我几乎可以保证,在这种情况下,你将无法做出比
字典
甚至
对象
更好的东西。你提出的计划可以奏效,但对这些都没有好处。我也觉得有必要建议向量优于数组,因为向量更快、更强大

哈希lib的问题是,它们通常会导致非常非常大的数字。例如,MD5将生成一个十六进制字符串,它所表示的内容甚至远远超过uint所能容纳的内容(uint在as中可以容纳2^32,MD5是2^128)。这也恰好是

这并不是说它们不能放入
数字中(可以容纳大约1.79*10^308),但这确实意味着你将失去数字索引的好处,而且你肯定不会从向量中获得太多好处。基本上,您将回到
对象上

老实说,看起来你确实有两个选择之一。您可以使用第二个数组/向量实现直接查找。这存在的问题是查找时间为O(n),而哈希表的查找时间为O(1)

至少在我看来,不管要做什么,你都需要使用
字典
对象

作为提醒——我几乎可以保证,在这一点上,你将无法做出比
字典
甚至
对象
更好的东西。你提出的计划可以奏效,但对这些都没有好处。我也觉得有必要建议向量优于数组,因为向量更快、更强大

哈希lib的问题是,它们通常会导致非常非常大的数字。例如,MD5将生成一个十六进制字符串,它所表示的内容甚至远远超过uint所能容纳的内容(uint在as中可以容纳2^32,MD5是2^128)。这也恰好是

这并不是说它们不能放入
数字中(可以容纳大约1.79*10^308),但这确实意味着你将失去数字索引的好处,而且你肯定不会从向量中获得太多好处。基本上,您将回到
对象上

老实说,看起来你确实有两个选择之一。您可以使用第二个数组/向量实现直接查找。这存在的问题是查找时间为O(n),而哈希表的查找时间为O(1)


至少在我看来,不管要做什么,您都需要使用
字典
对象

对于哈希表的实现,加密哈希函数是多余的

仅当您担心有人试图向您提供坏数据(例如,存在大量哈希冲突的密钥)以使哈希表变慢时,才使用此选项

对于哈希表的使用,下面这样的哈希函数就足够了(伪代码,因为我不知道正确的语法):


但是,正如其他答案所说,已经内置了一个哈希表,并且您实际上不需要重新实现它。

对于哈希表的实现,加密哈希函数是多余的

仅当您担心有人试图向您提供坏数据(例如,存在大量哈希冲突的密钥)以使哈希表变慢时,才使用此选项

对于哈希表的使用,下面这样的哈希函数就足够了(伪代码,因为我不知道正确的语法):


但正如其他答案所说,已经内置了一个哈希表,您实际上不需要重新实现它。

我这样做只是为了教育目的。在实际应用中,我将使用已经实现的字典。你的代码是什么意思?我的哈希代码(我认为这是一个非常标准的代码,可能除了选择13之外)是一个以字符代码作为系数的多项式,计算值为13。(使用任何其他数字,但质数做得最好。)尝试了这种方法。通常,对于key=“bob”,它会生成一个哈希代码=337。因此,通过在数组中插入具有此类键的项,例如_map[337]=MYKEY,我将得到一个包含337个空元素(其中一个不是空的)的数组。你觉得可以吗?我只是有点担心,如果在memoryNo中创建这么大的数组没有问题,您就不会使用这么大的数组。取而代之的是,选择一些大小
N
(取决于表中的条目数-例如,最多10个元素为16个),然后使用
哈希%N
作为数组的索引。(
%
是这里的模函数。)您还需要一种策略来处理哈希冲突。请查看以了解详细信息。但在这种情况下,Dict将不会自动展开,是吗?而且我认为我可以很容易地面对机智的情况