---
title: calculate
description: "调用隐私求交PSI类算子，实现两方或三方的隐私求交功能，目前支持多方输入字符串类型的数据集，返回结果为字符串数据交集或交集的下标。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0032.html
sourcePath: /source/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0032.html
indexId: c18e5f6a1705ad6638bd457b8c809b6b1f367d97040e02c44053f78614d1386664
---
# calculate

调用隐私求交PSI类算子，实现两方或三方的隐私求交功能，目前支持多方输入字符串类型的数据集，返回结果为字符串数据交集或交集的下标。

```
int calculate (
DG_TeeCtx *dgTeeCtx,
DG_AlgorithmsType type,
DG_TeeInput *input,
DG_TeeOutput **output,
DG_TeeMode outputMode
)
```

#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| dgTeeCtx | KCAL上下文信息 | 为initTeeCtx成功初始化的结果 | 输入 |
| type | 算子类型 DG\_AlgorithmsType | 目前支持PSI和PSU | 输入 |
| input | 输入数据 DG\_TeeInput | 目前支持字符串数组 | 输入 |
| outputMode | 输出的模式 DG\_TeeMode | 枚举类：TEE\_OUTPUT\_STRING或 TEE\_OUTPUT\_INDEX | 输入 |
| output | 算子计算结果 | 一级指针为空，二级指针不为空 | 输出 |


**表1 DG_TeeInput结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| data | DG\_MpcDataUnion | 输入数据strings的类型为DG\_String \*，doubleNumbers为double \*, u64Numbers类型为u64 \* |
| size | uint64\_t | 数据量 |
| dataType | DG\_MpcDataType | 数据类型枚举有： MPC\_STRING（PSI字符串交集） MPC\_INT（PSI字符串交集下标） |


**表2 DG_MpcDataUnion联合体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| strings | DG\_String | 字符串数组类型 |
| u64Numbers | u64 | u64数组 |
| doubleNumbers | double | double数组 |


DG_TeeOutput结构体与DG_TeeInput结构体类型一致。


#### 返回值

- 成功：返回0。
- 失败：返回错误码。


#### 错误码

| 错误码 | 错误码值 | 描述 | 特殊说明 |
| --- | --- | --- | --- |
| DG\_ERR\_MPC\_TEE\_INVALID\_PARAM | 4501 | 参数校验失败 | dgTeeCtx为null或output二级指针为NULL或通信回调未注册 input为NULL或size小于0或input中的string为null |
| DG\_ERR\_MPC\_TEE\_INVALID\_NODE\_INFO | 4503 | 无效的节点信息 | 节点信息从0开始依次递增 |
| DG\_FAILURE | 1 | 计算失败 | Hash失败 交换桶失败 求交失败 |


#### 依赖

- teeOpts依赖  DG_InitPsiOpts
的成功初始化KCAL函数组。
- 在计算PSI前，需要先调用setTeeNodeInfos接口设置所有节点信息。
- 依赖的头文件为"data_guard_mpc.h"。


#### 示例

使用调用DG_InitPsiOpts成功后的teeOpts来调用calculate接口。


```
#include  "data_guard_mpc.h"
#include <vector>
#include <string>
#include <cstring>
void BuildDgString(std::vector<std::string> &strings, DG_String **dg, unsigned int &size)
{
size = strings.size();
DG_String *dgString = new DG_String[strings.size()];
for (size_t i = 0; i < strings.size(); i++) {
dgString[i].str = strdup(strings[i].c_str());
dgString[i].size = strings[i].size() + 1;
}
*dg = dgString;
}
std::vector<std::string> datas = {"hello", "world"};
unsigned int size;
DG_String *strings = nullptr;
BuildDgString(datas, &strings, size);
DG_TeeInput teeInput;
teeInput.data.strings = strings;
teeInput.size = size;
teeInput.dataType = MPC_STRING;
struct DG_TeeOutput *output = nullptr;
// teeOpts为DG_InitPsiOpts成功后的结果，dgTee为initTeeCtx成功后的结果。
int res = teeOpts.calculate(dgTee, PSI, &teeInput, &output, TEE_OUTPUT_STRING);
```

运行结果: res结果为0且output不为null。
