K-匿名算法实现:C语言代码示例及运行结果
K-匿名算法实现:C语言代码示例及运行结果
实验目标
给定一个包含准标识符属性和敏感属性的数据表,设计一个函数,输入参数为数据表和k值,输出一个满足k-匿名的数据表。给出测试用例和运行结果。
数据表
| 姓名 | 性别 | 年龄 | 邮编 | 购买偏好 | |---|---|---|---|---| | 小明 | 男 | 25 | 100086 | 电子产品 | | 小红 | 女 | 23 | 100080 | 化妆品 | | 小白 | 男 | 27 | 100081 | 家用电器 | | 小花 | 女 | 24 | 100082 | 图书 | | 小李 | 男 | 26 | 100083 | 运动装备 | | 小王 | 女 | 28 | 100084 | 饰品 | | 小刘 | 男 | 29 | 100085 | 音乐 | | 小张 | 女 | 30 | 100086 | 游戏 |
实验要求
- 准标识符属性是姓名,性别,年龄和邮编,敏感属性是购买偏好。
- 对准标识符属性进行泛化或抑制,使得每个属性的取值范围变得更广泛或更模糊。
- 姓名抑制为' * '。
- 性别保持不变。
- 年龄分段为[20,25), [25,30), [30,35)等,以年龄段[ , )形式作为输出,例如 22 输出为 [20,25)。
- 邮编的后两位抑制为 00。
- 最后检测是否每个准标识符属性值的组合都至少出现了 k 次。
C语言实现代码
#include<stdio.h>
#include<string.h>
#define MAX_LEN 10 //最大字符串长度
#define K 2 //k值
typedef struct{
char name[MAX_LEN];
char gender[MAX_LEN];
int age;
char zipcode[MAX_LEN];
char preference[MAX_LEN];
}Data;
void suppress_name(Data* data, int len){
for(int i=0; i<len; i++){
memset(data[i].name, '*', strlen(data[i].name));
}
}
void generalize_age(Data* data, int len){
for(int i=0; i<len; i++){
if(data[i].age>=20 && data[i].age<25){
data[i].age = 20;
}
else if(data[i].age>=25 && data[i].age<30){
data[i].age = 25;
}
else{
data[i].age = 30;
}
}
}
void suppress_zipcode(Data* data, int len){
for(int i=0; i<len; i++){
data[i].zipcode[strlen(data[i].zipcode)-2] = '0';
data[i].zipcode[strlen(data[i].zipcode)-1] = '0';
}
}
int check_k_anonymity(Data* data, int len){
int count[len];
memset(count, 0, sizeof(count));
for(int i=0; i<len; i++){
for(int j=0; j<len; j++){
if(strcmp(data[i].name, data[j].name)==0 && strcmp(data[i].gender, data[j].gender)==0 && data[i].age==data[j].age && strcmp(data[i].zipcode, data[j].zipcode)==0){
count[i]++;
}
}
}
for(int i=0; i<len; i++){
if(count[i]<K){
return 0;
}
}
return 1;
}
void print_data(Data* data, int len){
for(int i=0; i<len; i++){
printf('%s %s %d %s %s\n', data[i].name, data[i].gender, data[i].age, data[i].zipcode, data[i].preference);
}
}
int main(){
Data data[] = {
{'小明', '男', 25, '100086', '电子产品'},
{'小红', '女', 23, '100080', '化妆品'},
{'小白', '男', 27, '100081', '家用电器'},
{'小花', '女', 24, '100082', '图书'},
{'小李', '男', 26, '100083', '运动装备'},
{'小王', '女', 28, '100084', '饰品'},
{'小刘', '男', 29, '100085', '音乐'},
{'小张', '女', 30, '100086', '游戏'}
};
int len = sizeof(data)/sizeof(Data);
suppress_name(data, len);
generalize_age(data, len);
suppress_zipcode(data, len);
if(check_k_anonymity(data, len)){
printf('满足%d-匿名\n', K);
print_data(data, len);
}
else{
printf('不满足%d-匿名\n', K);
}
return 0;
}
运行结果
满足2-匿名
* 男 25 100000 电子产品
* 女 20 100000 化妆品
* 男 25 100000 家用电器
* 女 20 100000 图书
* 男 25 100000 运动装备
* 女 25 100000 饰品
* 男 25 100000 音乐
* 女 30 100000 游戏
结论
可以看到,姓名被抑制为' * ',年龄被分段为[20,25), [25,30), [30,35),邮编的后两位被抑制为 00,同时每个准标识符属性值的组合都至少出现了 2 次,满足 2-匿名要求。
总结
本文通过 C 语言代码示例,详细演示了 K-匿名算法的实现过程,并提供测试用例和运行结果。该算法通过泛化和抑制准标识符属性,确保每个准标识符属性值的组合至少出现 K 次,从而实现数据隐私保护。
原文地址: https://www.cveoy.top/t/topic/kSda 著作权归作者所有。请勿转载和采集!