• 初始化,数据的行数,hash链表结构体,存储头结点

     #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    char path[] = "csdn.txt";
    //数据的行数
    #define N 6428633
    //字符串hash算法
    unsigned int BKDRHash(char *str); //hash链表结构体(结构体)
    struct beitai
    {
    char *pstr;//存储字符串
    struct beitai *pNext;//下一个节点
    }; //头结点
    struct info
    {
    struct beitai *pbt;
    }; //保持所有头结点
    struct info *pall = NULL;
  • 字符串hash算法
     //hasn算法
    unsigned int BKDRHash(char *str)
    {
    //和数据对应的位数有关
    unsigned int seed = ; // 31 131 1313 13131 131313 etc..
    unsigned int hash = ; while (*str)
    {
    hash = hash * seed + (*str++);
    } return (hash & 0x7FFFFFFF);
    }
  • 实现读取一行的数据的修改,并对这个字符串进行hash算法
     void changestr(char *str)
    {
    //备份地址
    char *pbak = str;
    //去除空格
    //下标
    int i = ;
    //游标
    int j = ;
    while ((str[i] = str[j++]) != '\0')
    {
    if (str[i] != ' ')
    {
    i++;
    }
    }
    //截断
    char *p1 = strstr(pbak, "#");
    if (p1 != NULL)
    {
    *p1 = '\0';
    }
    }
  • 载入内存
     void init()
    { pall = malloc(N*sizeof(struct info));
    memset(pall, , N*sizeof(struct info));//清空 //打开文件
    FILE *pf = fopen(path, "r");
    for (int i = ; i < N; i++)
    {
    char str[] = { };
    char strbak[] = { };
    //读取一行
    fgets(str, , pf);
    //拷贝
    strcpy(strbak, str);
    //字符串处理
    changestr(str);
    //获取hash对应的数字
    unsigned int data = BKDRHash(str);
    //进行取余
    unsigned int id = data %N;
    pall[id].pbt = addstr(pall[id].pbt, strbak);//找到链表节点,插入
    }
    fclose(pf);
    }
  • 插入节点
     //插入
    struct beitai *addstr(struct beitai *phead, char *str)
    {
    //开辟节点
    struct beitai *pnew = calloc(, sizeof(struct beitai));
    //获取字符串长度并开辟内存
    int length = strlen(str);
    pnew->pstr = calloc(length + , sizeof(char));
    //拷贝
    strcpy(pnew->pstr, str);
    //下一个结点为NULL
    pnew->pNext = NULL;
    //如果头结点为空
    if (phead==NULL)
    {
    phead = pnew;
    }
    //否则头部插入
    else
    {
    pnew->pNext = phead;
    phead = pnew; }
    return phead;
    }
  • 实现查询
     //实现查询
    void find(struct beitai *phead, char *findstr)
    {
    while (phead!=NULL)
    {
    char*ps = strstr(phead->pstr, findstr);
    if (ps!=NULL)
    {
    printf("%s", phead->pstr);//查找
    }
    phead = phead->pNext;
    }
    }
  • 获取有多少行
     int getN()
    {
    FILE *pf = fopen(path, "r");
    if (pf == NULL)
    {
    return -;
    }
    else
    {
    int i = ;
    while (!feof(pf))
    {
    char str[] = { };
    fgets(str, , pf);//读取
    i++;
    }
    fclose(pf);
    return i;
    }
    }
  • 主函数
     //主函数
    void main()
    {
    //初始化并载入内存
    init();
    //查询
    while ()
    {
    char str[] = { };
    scanf("%s", str);
    unsigned int id = BKDRHash(str) % N;
    find(pall[id].pbt, str);
    }
    system("pause");
    }

89.hash算法实现CSDN密码处理的更多相关文章

  1. [区块链] 密码学中Hash算法(基础)

    在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理——基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...

  2. Hash算法总结(转)

    1. Hash是什么,它的作用先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人 ...

  3. 关于 Spring Security 5 默认使用 Password Hash 算法

    账户密码存储的安全性是一个很老的话题,但还是会频频发生,一般的做法是 SHA256(userInputpwd+globalsalt+usersalt) 并设置密码时时要求长度与大小写组合,一般这样设计 ...

  4. Hash算法总结

    1. Hash是什么,它的作用 先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的 ...

  5. [区块链] 加密算法——Hash算法(进阶)

    为了为保证存储于区块链中的信息的安全与完整,区块链中使用了包含密码哈希函数和椭圆曲线公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共识算法并识别用户. 在前边 ...

  6. Hash算法的讲解

    散列表,又叫哈希表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash ta ...

  7. 从hash算法到java hashcode()

    转载 https://blog.csdn.net/Walk_er/article/details/74976146 hash算法是一个摘要算法(yy:描述性算法:可以给一个物体确切的描述,但是不能通过 ...

  8. 深入理解 hashcode 和 hash 算法

    深入理解 hashcode 和 hash 算法 2017年12月30日 23:06:07 阅读数:5197 标签: hashhashmaphashcode二进制 更多 个人分类: jdk-源码  ht ...

  9. 常见的哈希Hash算法 & MD5 & 对称非对称加密 & 海明码

    参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/charlesblc/p/5990475.html DJB的算法实现核心是 ...

随机推荐

  1. 关于Hive在主节点上与不在主节点上搭建的区别之谈

    Hive不在主节点上搭建,我这里是在HadoopSlave1上.

  2. CORS support in Spring Framework--官方

    原文地址:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework For security reasons, browse ...

  3. MVC页面常用方法

    转自:https://www.cnblogs.com/baisoft/p/5839319.html @RenderBody 在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Lay ...

  4. LeetCode 0、《两数相加》

    一.给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...

  5. OpenSUSE Leap 42.3下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法

    远程虚拟控制台依赖于java运行环境(jre),在通过浏览器打开链接前,系统必须安装jre环境,远程管理控制台其实就是一个java程序,打开相应的网站会下载一个jnlp(java网络加载协议)的文件, ...

  6. 在Windows下如何创建指定的虚拟环境

    前几天给大家分享了如何在默认的情况下创建虚拟环境,没来得及上车的伙伴,可以戳这篇文章:在Windows下如何创建虚拟环境(默认情况下).今天小编给大家分享一下,如何创建的指定的Python环境. 创建 ...

  7. Scrapy请求传参

    scrapy.Request(url=url, callback=self.parse_item, meta={'item': item}, headers=headers) url: 要请求的地址 ...

  8. 超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集

    原文:超好用的谷歌浏览器.Sublime Text.Phpstorm.油猴插件合集 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.c ...

  9. oracle查询字段大于指定长度的数据

    select * from MES_MACHINE_RECORD t where length(t.bar_code2)<10 ;

  10. 在AT151上面测试串口通讯

    如下图所示,分别用putty打开两个窗口,一个是串口打开的,另外一个是网口连接的,分别是接收和发送,硬件上面RXD和TXD进行短接进行数据回流. 使用microcom工具,ctrl+x可以退出 参考文 ...