---
title: Find
description: "参数结构体存储了哈希表已存储的键值对，给定一个要查找的键keys以及未查找到对应键插入的值defaultValue，长度length，查找的值会存储于values。例如："
url: https://www.hikunpeng.com/document/detail/zh/boostsra/srainference/SRA_Inference/kunpengsra_inference_16_0028.html
sourcePath: /source/zh/boostsra/srainference/SRA_Inference/kunpengsra_inference_16_0028.html
indexId: 87e8e5d433c8cc221e8b7f725dd313b9b6b29a0acdc82c8479d4801cd44cdaa780
---
# Find

#### 场景说明

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

```
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
```


#### 代码示例

```
#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;
 }
```
