K-匿名算法实现:C语言代码示例及运行结果

实验目标

给定一个包含准标识符属性和敏感属性的数据表,设计一个函数,输入参数为数据表和k值,输出一个满足k-匿名的数据表。给出测试用例和运行结果。

数据表

| 姓名 | 性别 | 年龄 | 邮编 | 购买偏好 | |---|---|---|---|---| | 小明 | 男 | 25 | 100086 | 电子产品 | | 小红 | 女 | 23 | 100080 | 化妆品 | | 小白 | 男 | 27 | 100081 | 家用电器 | | 小花 | 女 | 24 | 100082 | 图书 | | 小李 | 男 | 26 | 100083 | 运动装备 | | 小王 | 女 | 28 | 100084 | 饰品 | | 小刘 | 男 | 29 | 100085 | 音乐 | | 小张 | 女 | 30 | 100086 | 游戏 |

实验要求

  1. 准标识符属性是姓名,性别,年龄和邮编,敏感属性是购买偏好。
  2. 对准标识符属性进行泛化或抑制,使得每个属性的取值范围变得更广泛或更模糊。
  3. 姓名抑制为' * '。
  4. 性别保持不变。
  5. 年龄分段为[20,25), [25,30), [30,35)等,以年龄段[ , )形式作为输出,例如 22 输出为 [20,25)。
  6. 邮编的后两位抑制为 00。
  7. 最后检测是否每个准标识符属性值的组合都至少出现了 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 次,从而实现数据隐私保护。

K-匿名算法实现:C语言代码示例及运行结果

原文地址: https://www.cveoy.top/t/topic/kSda 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录