Find

场景说明

参数结构体存储了哈希表已存储的键值对,给定一个要查找的键keys以及未查找到对应键插入的值defaultValue,长度length,查找的值会存储于values。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int64_t keyBucket[] = {104, 101, 201, -1};    //已存储于哈希表的键值
float valueBucket[] = {4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7,
                           1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7,
                           2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
                           0, 0, 0, 0, 0, 0, 0, 0};
keys: [101, 110, 201, 104]
defaultValue: [1, 1, 1, 1, 1, 1, 1, 1]
values[1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7,
         1,  1,   1,   1,   1,   1,   1,   1,
         2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
         4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7]
length: 4

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cmath>
#include <random>
#include <cstdint>
#include <iostream>

#include "ktfop.h"
void KtfopLog(int level, const char *message)
{
  std::cout << level << ' ' << message << std::endl;
}
int main()
{
    using namespace ktfop;
    
    SetExternalLogFunc(KtfopLog);
    int64_t numBuckets = 4;          //配置哈希桶个数
    int64_t valueSize = 8;           //配置embedding长度
    int64_t emptyKey = -1;           //空键所代表的值
    int64_t deletedKey = -2;         //已删除键所代表的值
    int64_t keyBucket[] = {104, 101, 201, -1};
    float valueBucket[] = {4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7,
                           1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7,
                           2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
                           0, 0, 0, 0, 0, 0, 0, 0};
    TableInfo info {numBuckets, valueSize, emptyKey, deletedKey, keyBucket, valueBucket};
    int64_t length = 4;
    int64_t keys[] = {101, 110, 201, 104};                     
    auto *values = new float[info.valueSize * length];
    float defaultValue[] = {1, 1, 1, 1, 1, 1, 1, 1};       
    int ret = Find(info, keys, values, defaultValue, length); 
    std::cout << "values: [";
    for (int i = 0; i < info.valueSize * length; ++i) {
        std::cout << values[i];
        if (i < info.valueSize * length - 1) {
            std::cout << ", ";
        }
    }
    std::cout << "]" << std::endl;
    //键列表含有空键,打印日志"ERROR Using the emptyKey as a table key is not allowed."
    keys[0] = info.emptyKey;
    ret = Find(info, keys, values, defaultValue, length);                     
    
    //键列表含有表示已删除的键,打印日志"ERROR Using the deletedKey as a table key is not allowed"
    keys[0] = info.deletedKey;
    ret = Find(info, keys, values, defaultValue, length);    
    //输入空指针,打印日志"ERROR Parameter verification failed for the Find Op."             
    keys[0] = 101;
    ret = Find(info, nullptr, values, defaultValue, length);                 
    
    //输入空指针,打印日志"ERROR Parameter verification failed for the Find Op."
    info.valueBucket = nullptr;
    ret = Find(info, keys, values, defaultValue, length);    
         
    //emptyKey=deletedKey,打印日志"ERROR Empty and deleted key cannot be equal."       
    info.valueBucket = valueBucket;
    info.emptyKey = info.deletedKey;
    ret = Find(info, keys, values, defaultValue, length);       
         
    //numBuckets不是2的幂,打印日志"ERROR numBuckets must be power of 2."
    info.emptyKey = -1;
    info.numBuckets = 5;
    ret = Find(info, keys, values, defaultValue, length);      
                 
    //numBuckets小于0,打印日志"ERROR numBuckets is invalid."
    info.numBuckets = 4;
    info.numBuckets = -1;
    ret = Find(info, keys, values, defaultValue, length);   
               
    //length小于0,打印日志"ERROR Length value is invalid."
    info.numBuckets = 4;
    ret = Find(info, keys, values, defaultValue, static_cast<size_t>(-1)); 
    //valueSize小于0,打印日志"ERROR valueSize is invalid."
    info.valueSize = -1;
    ret = Find(info, keys, values, defaultValue, length);       
          
    //keyBucket 排布规律错误,打印日志"ERROR Internal error in MutableDenseHashTable lookup."
    info.valueSize = valueSize;
    info.keyBucket[3] = 202;
    ret = Find(info, keys, values, defaultValue, length);                 
    delete[] values;
 }