|
60精币
附 类_快速哈希表对象源码
源码中读(HashTable_Get)是根据指定键读取取值,寻求怎么添加一个根据指定值读取键
要求和读写法类似
.版本 2
.子程序 HashTable_Get, 通用型, , 获取值
.参数 hHashTable, 整数型
.参数 key, 通用型, 参考
.局部变量 pKey, 整数型
.局部变量 ret, 整数型
.局部变量 hash, 整数型
.局部变量 index, 整数型
.局部变量 pe, 整数型
.局部变量 Entry_HashCode, 整数型
.局部变量 Entry_Key, 整数型
.局部变量 Entry_Value, 整数型
.局部变量 Entry_next, 整数型
.局部变量 HashTable_hHeap, 整数型, , , 堆句柄
.局部变量 HashTable_table, 整数型, , , 表
.局部变量 HashTable_tableLenth, 整数型, , , 表大小
.局部变量 HashTable_count, 整数型, , , 总数
.局部变量 HashTable_threshold, 整数型, , , 扩容临界值
.局部变量 HashTable_loadFactor, 小数型, , , 加载因子
.局部变量 HashTable_modCount, 整数型, , , 被修改次数
.局部变量 HashTable_keyType, 整数型
.局部变量 HashTable_valType, 整数型
pKey = 0
ret = 0
置入代码 ({ 139, 69, 12, 139, 0, 137, 69, 252 })
' mov eax,[ebp+12]
' mov eax,[eax]
' mov [ebp-04],eax
.如果真 (hHashTable = 0)
.判断开始 (HashTable_valType = #整数型)
置入代码 ({ 185, 1, 3, 0, 128 })
' mov ecx,0x80000301
.判断 (HashTable_valType = #文本型)
置入代码 ({ 185, 4, 0, 0, 128 })
' mov ecx,0x80000004
.判断 (HashTable_valType = #字节集型)
置入代码 ({ 185, 5, 0, 0, 128 })
' mov ecx,0x80000005
.默认
.判断结束
置入代码 ({ 49, 192, 201, 194, 8, 0 })
' xor eax,eax
' leave
' retn 08
返回 (0)
.如果真结束
HashTable_hHeap = 读内存_ (hHashTable, #ht_hHeap)
HashTable_table = 读内存_ (hHashTable, #ht_table)
HashTable_tableLenth = 读内存_ (hHashTable, #ht_tableLenth)
HashTable_count = 读内存_ (hHashTable, #ht_count)
HashTable_keyType = 读内存_ (hHashTable, #ht_keyType)
HashTable_valType = 读内存_ (hHashTable, #ht_valType)
hash = HashTable_GetHashCode (HashTable_keyType, key)
index = 位与 (hash, 2147483647) % HashTable_tableLenth
pe = 读内存 (HashTable_table + index × 4)
.判断循环首 (pe ≠ 0)
Entry_HashCode = 读内存_ (pe, #e_hashCode)
Entry_Key = 读内存_ (pe, #e_key)
Entry_Value = 读内存_ (pe, #e_value)
Entry_next = 读内存_ (pe, #e_next)
.如果真 (Entry_HashCode = hash 且 HashTable_Equal (HashTable_keyType, Entry_Key, pKey))
ret = HashTable_Assign (GetProcessHeap (), HashTable_valType, Entry_Value)
.判断开始 (HashTable_valType = #整数型)
置入代码 ({ 185, 1, 3, 0, 128 })
' mov ecx,0x80000301
.判断 (HashTable_valType = #文本型)
置入代码 ({ 185, 4, 0, 0, 128 })
' mov ecx,0x80000004
.判断 (HashTable_valType = #字节集型)
置入代码 ({ 185, 5, 0, 0, 128 })
' mov ecx,0x80000005
.默认
.判断结束
置入代码 ({ 139, 69, 248, 201, 194, 8, 0 })
' mov eax,[ebp-08]
' leave
' ret 08
返回 (0)
.如果真结束
pe = Entry_next
.判断循环尾 ()
.判断开始 (HashTable_valType = #整数型)
置入代码 ({ 185, 1, 3, 0, 128 })
' mov ecx,0x80000301
.判断 (HashTable_valType = #文本型)
置入代码 ({ 185, 4, 0, 0, 128 })
' mov ecx,0x80000004
.判断 (HashTable_valType = #字节集型)
置入代码 ({ 185, 5, 0, 0, 128 })
' mov ecx,0x80000005
.默认
.判断结束
置入代码 ({ 49, 192, 201, 194, 8, 0 })
' xor eax,eax
' leave
' retn 08
返回 (0)
补充内容 (2022-5-9 15:20):
因为cha询的值可能存在多个,所以cha询到键可能也存在多个,所以返回的是数组数量,且参数key属于参考通用型数组
补充内容 (2022-5-9 15:51):
.版本 2
.子程序 HashTable_Get2, 整数型, , 返回数组数量
.参数 hHashTable, 整数型
.参数 key, 通用型, , 这是想cha询的值
.参数 keys, 通用型, 参考 数组, 这返数组 |
|