各种哈希函数的C语言程序代码
可以完成商品归类的c语言程序
![可以完成商品归类的c语言程序](https://img.taocdn.com/s3/m/969b667fef06eff9aef8941ea76e58fafab045f4.png)
可以完成商品归类的c语言程序商品归类是一个涉及到数据结构和算法的问题,可以使用C语言来实现。
以下是一个简单的示例,该示例中,我们定义了一个商品类(Product),其中包含商品名称(name)和商品类型(type)。
然后,我们使用一个哈希表来存储这些商品,并使用一个函数来对商品进行分类。
```cinclude <>include <>// 定义商品结构体typedef struct Product {char name[50];char type[20];} Product;// 定义哈希表结构体typedef struct HashMap {Product products;int size;int count;} HashMap;// 初始化哈希表HashMap initHashMap(int size) {HashMap hashMap = (HashMap)malloc(sizeof(HashMap)); hashMap->products = (Product)malloc(sizeof(Product) size); hashMap->size = size;hashMap->count = 0;return hashMap;}// 向哈希表中添加商品void addProduct(HashMap hashMap, Product product) {int index = strlen() % hashMap->size;hashMap->products[index] = product;}// 商品归类函数void classifyProducts(HashMap hashMap) {for (int i = 0; i < hashMap->size; i++) {printf("Type: %s\n", hashMap->products[i].type);printf("Products:\n");for (int j = 0; j < hashMap->count; j++) {if (strcmp(hashMap->products[i].type, hashMap->products[j].type) == 0) {printf(" %s\n", hashMap->products[j].name);}}printf("\n");}}int main() {HashMap hashMap = initHashMap(10);Product products[] = {{"apple", "fruit"}, {"carrot", "vegetable"}, {"banana", "fruit"}, {"onion", "vegetable"}};for (int i = 0; i < sizeof(products) / sizeof(Product); i++) {addProduct(hashMap, products[i]);}classifyProducts(hashMap);return 0;}```在上面的代码中,我们首先定义了一个商品结构体(Product),其中包含商品名称和类型。
c语言哈希库函数
![c语言哈希库函数](https://img.taocdn.com/s3/m/a8efd5f288eb172ded630b1c59eef8c75fbf95ab.png)
c语言哈希库函数一、概述哈希表是一种常见的数据结构,用于实现键值对的快速查找。
C语言中没有内置的哈希表库,但可以通过编写自己的哈希库函数来实现相同的功能。
本文将介绍如何编写一个基本的哈希库函数。
二、哈希函数哈希函数是将键映射到索引的算法。
它应该满足以下要求:1. 对于相同的键,始终返回相同的索引。
2. 对于不同的键,尽可能返回不同的索引。
3. 将键均匀地分布在索引范围内。
常用的哈希函数包括除留余数法、乘法散列法和SHA等。
下面是一个简单的除留余数法哈希函数:```unsigned int hash(char *key, int size) {unsigned int hashval = 0;for (int i = 0; key[i] != '\0'; i++) {hashval = key[i] + 31 * hashval;}return hashval % size;}```该函数将每个字符转换为ASCII码并加权求和,然后使用除留余数法将结果映射到索引范围内。
三、数据结构为了实现哈希表,我们需要定义一个包含以下成员变量的结构体:```typedef struct {char *key;void *value;} HashNode;typedef struct {int size;int count;HashNode **nodes;} HashTable;```其中,HashNode表示哈希表中的一个键值对,key为键,value为值。
HashTable包含三个成员变量:1. size:哈希表的大小。
2. count:哈希表中键值对的数量。
3. nodes:指向HashNode指针数组的指针。
四、初始化函数在使用哈希表之前,需要先创建一个空的HashTable对象。
下面是一个简单的初始化函数:```HashTable *hash_init(int size) {HashTable *table = malloc(sizeof(HashTable));table->size = size;table->count = 0;table->nodes = calloc(size, sizeof(HashNode *));return table;}```该函数分配内存并将成员变量初始化为初始值。
c++字符串哈希计算
![c++字符串哈希计算](https://img.taocdn.com/s3/m/b530337d366baf1ffc4ffe4733687e21ae45ff13.png)
在C++中,计算字符串的哈希值通常涉及到使用某种哈希函数。
哈希函数将输入(在这种情况下是字符串)转换为固定大小的输出,通常是整数。
这个输出被称为哈希值或哈希码。
在C++标准库中,没有内置的字符串哈希函数,但你可以使用第三方库,如Boost,或者自己实现一个简单的哈希函数。
另外,C++11引入了std::hash模板类,它可以用于获取标准类型的哈希值,包括std::string。
下面是一个使用std::hash来计算字符串哈希值的例子:cpp#include <iostream>#include <string>#include <functional>int main() {std::string str = "Hello, World!";std::hash<std::string> hasher;size_t hash = hasher(str);std::cout << "Hash value of \"" << str << "\" is: " << hash << std::endl; return 0;}在这个例子中,我们使用了std::hash<std::string>来创建一个字符串哈希函数对象。
然后,我们通过调用这个函数对象并传入我们的字符串来计算哈希值。
最后,我们打印出计算得到的哈希值。
请注意,不同的编译器和平台可能会产生不同的哈希值,因为C++标准并没有规定std::hash 的具体实现。
因此,如果你需要跨平台的一致性,你可能需要使用一个特定的哈希算法,如MD5、SHA-1或SHA-256,这些都可以通过第三方库(如OpenSSL或Crypto++)来实现。
然而,这些算法通常用于密码学和数据完整性检查,而不是普通的哈希表查找。
c语言开源hash项目——uthash
![c语言开源hash项目——uthash](https://img.taocdn.com/s3/m/c9a40a092379168884868762caaedd3383c4b5df.png)
c语言开源 hash项目 ——uthash
1 //------------------------------------------
2 // c语言 开源hash项目 —— uthash
3 //
4 //
5 //eg: 对 字符串进行查找和删除 字符指针
6 //
7 // warning: uthash 对 字符指针和字符数组,
8 //
插入的函数是不一样的,查找的函数是一致的
9 //
对所有的类型,删除的操作
10 //-------------------------------------------
21 UT_hash_handle hh;
22 }uthash_int;
23
24 // 查找
25 uthash_int *find_uthash_int(uthash_int *g_users, int ikey)
26 {
27 uthash_int *s = NULL;
28 HASH_FIND_INT(g_users, &ikey, s);
11
12 #include "gtest/gtest.h"
13 #include <iostream>
14 using namespace std;
15
16 #include"uthash/uthash.h"
17
18 typedef struct {
常用Hash算法(C语言的简单实现)
![常用Hash算法(C语言的简单实现)](https://img.taocdn.com/s3/m/5091ea05876fb84ae45c3b3567ec102de2bddfa7.png)
常⽤Hash算法(C语⾔的简单实现)如下所⽰:#include "GeneralHashFunctions.h"unsigned int RSHash(char* str, unsigned int len){unsigned int b = 378551;unsigned int a = 63689;unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = hash * a + (*str);a = a * b;}return hash;}/* End Of RS Hash Function */unsigned int JSHash(char* str, unsigned int len){unsigned int hash = 1315423911;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash ^= ((hash << 5) + (*str) + (hash >> 2));}return hash;}/* End Of JS Hash Function */unsigned int PJWHash(char* str, unsigned int len){const unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8);const unsigned int ThreeQuarters = (unsigned int)((BitsInUnsignedInt * 3) / 4);const unsigned int OneEighth = (unsigned int)(BitsInUnsignedInt / 8);const unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);unsigned int hash = 0;unsigned int test = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (hash << OneEighth) + (*str);if((test = hash & HighBits) != 0){hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));}}return hash;}/* End Of P. J. Weinberger Hash Function */unsigned int ELFHash(char* str, unsigned int len){unsigned int hash = 0;unsigned int x = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (hash << 4) + (*str);if((x = hash & 0xF0000000L) != 0){hash ^= (x >> 24);}hash &= ~x;}return hash;}/* End Of ELF Hash Function */unsigned int BKDRHash(char* str, unsigned int len){unsigned int seed = 131; /* 31 131 1313 13131 131313 etc.. */ unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (hash * seed) + (*str);}return hash;}/* End Of BKDR Hash Function */unsigned int SDBMHash(char* str, unsigned int len){unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = (*str) + (hash << 6) + (hash << 16) - hash;}return hash;}/* End Of SDBM Hash Function */unsigned int DJBHash(char* str, unsigned int len){unsigned int hash = 5381;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = ((hash << 5) + hash) + (*str);}return hash;}/* End Of DJB Hash Function */unsigned int DEKHash(char* str, unsigned int len){unsigned int hash = len;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = ((hash << 5) ^ (hash >> 27)) ^ (*str);}return hash;}/* End Of DEK Hash Function */unsigned int BPHash(char* str, unsigned int len){unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash = hash << 7 ^ (*str);}return hash;}/* End Of BP Hash Function */unsigned int FNVHash(char* str, unsigned int len){const unsigned int fnv_prime = 0x811C9DC5;unsigned int hash = 0;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash *= fnv_prime;hash ^= (*str);}return hash;}/* End Of FNV Hash Function */unsigned int APHash(char* str, unsigned int len){unsigned int hash = 0xAAAAAAAA;unsigned int i = 0;for(i = 0; i < len; str++, i++){hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ (*str) * (hash >> 3)) :(~((hash << 11) + ((*str) ^ (hash >> 5))));}return hash;}/* End Of AP Hash Function */以上就是⼩编为⼤家带来的常⽤Hash算法(C语⾔的简单实现)的全部内容了,希望对⼤家有所帮助,多多⽀持~。
argon2的c语言实现代码
![argon2的c语言实现代码](https://img.taocdn.com/s3/m/ad3905bdf71fb7360b4c2e3f5727a5e9846a2717.png)
一、概述argon2是一种密码哈希算法,旨在提供高度安全性和灵活性。
它是继MD5、SHA-1、SHA-256等算法之后的一种新型哈希算法。
argon2的C语言实现代码是其最常用的形式之一,本文将对argon2的C语言实现代码进行详细的介绍和分析。
二、argon2的C语言实现代码介绍1. 代码结构argon2的C语言实现代码由多个源文件组成,主要包括argon2.c、core.c、blake2b.c、thread.c等。
其中,argon2.c是入口文件,包含了主要的算法逻辑;core.c包含了主要的核心算法实现;blake2b.c 实现了Blake2b哈希算法,用于处理数据块的哈希计算;thread.c实现了多线程相关的功能。
2. 关键函数在argon2的C语言实现代码中,包含了许多关键性的函数,如argon2_hash()函数用于执行哈希计算;fill_block()函数用于填充数据块;finalize()函数用于最终的哈希结果处理等。
3. 代码逻辑argon2的C语言实现代码采用了一系列复杂的算法和数据结构,包括哈希函数、内存管理、并行计算等。
其中,核心算法是基于Blake2b哈希算法,通过多轮迭代和混洗操作,实现了对输入密码和盐值的安全哈希计算。
三、分析与优化1. 性能优化argon2的C语言实现代码在计算哈希时,存在着大量的内存访问和计算操作,因此需要针对不同的评台和硬件优化性能。
可以通过调整参数、优化内存分配、采用SIMD指令优化等手段,提高算法的执行效率。
2. 安全性考虑在实现argon2的C语言代码时,需要注意安全性方面的考量,如防止缓冲区溢出、防止内存泄漏等问题。
还需遵循密码学原则,确保算法在各种攻击下具有较高的安全性。
四、应用与发展1. 密码学领域argon2的C语言实现代码在密码学领域得到了广泛的应用,被用于密码存储、身份验证等场景,取代了传统的哈希算法,提供了更高的安全性和抗攻击能力。
POCO C++库学习和分析 -- 哈希
![POCO C++库学习和分析 -- 哈希](https://img.taocdn.com/s3/m/589941dd28ea81c758f57823.png)
POCO C++库学习和分析-- 哈希1. Hash概论在理解Poco中的Hash代码之前,首先需要了解一下Hash的基本理论。
下面的这些内容和教课书上的内容并没有太大的差别。
1.1 定义下面这几段来自于百度百科:Hash:一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash table:散列表,也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。
也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
这个映射函数叫做散列函数,存放记录的数组叫做散列表。
* 若结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。
由此,不需比较便可直接取得所查记录。
这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。
* 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。
具有相同函数值的关键字对该散列函数来说称做同义词。
* 综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。
科学家计算过,当重载因子不超过75%,查找效率最高。
* 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
SHA1算法源代码
![SHA1算法源代码](https://img.taocdn.com/s3/m/18e978bf05a1b0717fd5360cba1aa81144318f16.png)
SHA1算法源代码SHA-1(Secure Hash Algorithm 1)是一种常见的哈希算法,用于生成哈希值,常用于密码学和安全领域。
下面是SHA-1算法的详细源代码:```pythonimport struct#初始化常数h1=0xEFCDAB89h2=0x98BADCFEh4=0xC3D2E1F0def sha1(message):"""输入:字符串message输出:字符串的SHA-1哈希值"""#补位original_length = len(message) * 8message += b'\x80'while (len(message) + 8) % 64 != 0:message += b'\x00'message += struct.pack('>Q', original_length)#分组blocks = []for i in range(0, len(message), 64):block = message[i:i+64]blocks.append(block)#处理每个分组for block in blocks:w = list(struct.unpack('>16I', block))#扩展消息for i in range(16, 80):w.append(left_rotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]), 1))#初始化哈希值a=h0b=h1c=h2d=h3e=h4#执行80轮循环for i in range(0, 80):if 0 <= i < 20:f=(b&c),((~b)&d)elif 20 <= i < 40:f=b^c^dk=0x6ED9EBA1elif 40 <= i < 60:f=(b&c),(b&d),(c&d)k=0x8F1BBCDCelse:f=b^c^dk=0xCA62C1D6temp = (left_rotate(a, 5) + f + e + k + w[i]) & 0xffffffff e=dd=cc = left_rotate(b, 30)b=aa = temp#更新哈希值h0 = (h0 + a) & 0xffffffffh1 = (h1 + b) & 0xffffffffh2 = (h2 + c) & 0xffffffffh3 = (h3 + d) & 0xffffffffh4 = (h4 + e) & 0xffffffff#输出哈希值digest = struct.pack('>5I', h0, h1, h2, h3, h4)return digest.hexdef left_rotate(n, b):"""左旋转n"""return ((n << b) , (n >> (32 - b))) & 0xffffffff```上面的代码实现了SHA-1算法的核心部分。
c语言自带的hash函数
![c语言自带的hash函数](https://img.taocdn.com/s3/m/a4363cc1f71fb7360b4c2e3f5727a5e9846a2774.png)
c语言自带的hash函数C语言自带的哈希函数指的是stdlib库中提供的哈希算法函数。
在C语言中,stdlib库是一个通用的标准库,提供了一系列常用的函数,其中包括很多常用的哈希算法函数。
在实际编程中,使用stdlib库中的哈希函数可以方便快捷地完成各种哈希操作。
具体来说,stdlib库中提供了两个常用的哈希函数,分别是:1. hash()2. hcreate()其中,hash()函数用于计算给定键值的哈希值,而hcreate()函数用于创建一个哈希表。
下面将逐一介绍这两个函数的详细用法和作用。
1. hash()函数hash()函数是stdlib库中提供的一个常用的哈希算法函数,用于计算给定键值的哈希值。
该函数可以用于任何数据结构的哈希表中,包括数组、字符串、结构体等等。
hash()函数的定义如下:unsigned hash(const void *key, size_t length)其中,key为输入的键值,length为键值的长度。
该函数的返回值为一个unsigned整数,表示计算出来的哈希值。
在使用hash()函数时,需要注意以下几点:(1)键值必须以一个void类型的指针的形式传递给hash()函数,并使用length 指定键值的长度。
(2)哈希值的计算结果是一个无符号整数,其取值范围为[0, 4294967295]。
(3)hash()函数使用了一个简单的算法来计算哈希值。
该算法会按位操作键值,并使用数学运算将位运算结果组合成一个哈希值。
2. hcreate()函数hcreate()函数是stdlib库中提供的一个用于创建哈希表的函数。
该函数可以用于创建任何种类的哈希表,包括使用链表或数组实现的哈希表。
关于hcreate()函数的使用,以下是一些常见的注意事项:(1)创建哈希表时,需要事先确定哈希表的大小,然后将该大小作为参数传递给hcreate()函数。
(2)hcreate()函数返回值为0时表示成功创建哈希表,否则表示创建哈希表失败。
c语言 位运算 计算 hash码
![c语言 位运算 计算 hash码](https://img.taocdn.com/s3/m/1f1abcc903d276a20029bd64783e0912a2167c23.png)
c语言位运算计算hash码一、概述在计算机科学和信息技术领域中,hash码是一种重要的数据结构,它能够将数据映射到一个固定长度的唯一标识符上。
在实际应用中,hash码常常被用于加速数据存储和查找的速度,因此对于计算hash 码的方法和效率的研究变得尤为重要。
而位运算作为c语言中的一种常用操作,其高效的处理速度,使得它成为计算hash码的一个重要工具。
本文将介绍位运算在c语言中计算hash码的方法及其实际应用。
二、位运算的基础知识1. 位运算的基本操作位运算是指对二进制数进行的一种操作,其基本操作包括与()、或(|)、异或(^)、取反(~)、左移(<<)和右移(>>)等。
这些操作可以对二进制数据进行高效的处理,常用于编写底层的算法和数据结构。
2. 位运算的特点位运算具有处理速度快、空间效率高等特点,适合于对大规模数据进行高效的处理。
在计算hash码中,合理地利用位运算可以大大提高计算速度和节省计算资源。
三、哈希算法1. 哈希算法的概念哈希算法是指将任意长度的输入数据通过哈希函数变换为固定长度的输出数据的过程。
这个输出数据即为哈希码。
哈希算法常常用于数据加密、数据完整性校验、数据查找等方面。
2. 常见的哈希算法常见的哈希算法包括MD5、SHA-1、SHA-256等。
这些算法具有不同的特点和适用范围,但都能够将输入数据映射为固定长度的哈希码。
四、位运算计算哈希码1. 位运算在哈希码计算中的作用位运算可以通过对二进制数据的操作,使得在计算哈希码时可以高效地进行数据处理。
在c语言中,位运算常常被用于哈希码的计算中,尤其适用于处理大规模数据。
2. 位运算计算哈希码的原理位运算在计算哈希码时,通常通过将数据转换为二进制形式,并利用位运算的与、或、异或等操作进行数据处理。
通过合理地设计位运算的规则,可以得到固定长度的哈希码,并保证数据的唯一性和不可逆性。
3. 位运算计算哈希码的实际应用在实际应用中,位运算计算哈希码常常用于大规模数据的处理和存储。
stm32 c语言 阿里云 哈希算法
![stm32 c语言 阿里云 哈希算法](https://img.taocdn.com/s3/m/262d8cb69f3143323968011ca300a6c30c22f1cc.png)
stm32 c语言阿里云哈希算法
在STM32中使用C语言实现阿里云的哈希算法,可以采用以下步骤:
1. 安装阿里云的SDK,在头文件中包含"HMAC_SHA1.h"和"HMAC_MD5.h"这两个文件。
2. 配置STM32的加密硬件模块,用于加密操作。
3. 定义密钥和明文,在程序中调用HMAC_MD5或者HMAC_SHA1函数进行哈希算法。
例如:
c
#include "HMAC_SHA1.h"
#include "HMAC_MD5.h"
unsigned char key[16] = "1234567890ABCDEF";
unsigned char text[16] = "hello world";
unsigned char result[SHA1_BLOCK_SIZE];
HMAC_SHA1(key, 16, text, 11, result);
4. 处理加密结果,在使用阿里云服务时,需要将加密结果转换成Base64格式,进行字符串拼接等操作。
可以使用Base64编解码函数进行处理。
例如:
c
#include "base64.h"
unsigned char output[SHA1_BLOCK_SIZE * 2];
Base64_Encode(result, SHA1_BLOCK_SIZE, output);
通过以上步骤,就可以在STM32中使用C语言实现阿里云的哈希算法了。
C语言获取文件SHA1哈希
![C语言获取文件SHA1哈希](https://img.taocdn.com/s3/m/d92f6ad48ad63186bceb19e8b8f67c1cfad6eead.png)
C语⾔获取⽂件SHA1哈希安全散列算法(Secure Hash Algorithm)主要适⽤于数字签名标准(Digital Signature Standard DSS)它定义了数字签名算法(Digital Signature Algorithm DSA)。
对于长度⼩于2^64位的消息。
SHA1会产⽣⼀个160位的消息摘要。
当接收到消息的时候,这个消息摘要能够⽤来验证数据的完整性。
在传输的过程中。
数据⾮常可能会发⽣变化,那么这时候就会产⽣不同的消息摘要。
SHA1有例如以下特性:不能够从消息摘要中复原信息。
两个不同的消息不会产⽣相同的消息摘要。
SHA1 C语⾔实现#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <errno.h>#undef BIG_ENDIAN_HOSTtypedef unsigned int u32;/***************** Rotate a 32 bit integer by n bytes*/#if defined(__GNUC__) && defined(__i386__)static inline u32rol( u32 x, int n){__asm__("roll %%cl,%0":"=r" (x):"0" (x),"c" (n));return x;}#else#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )#endiftypedef struct {u32 h0,h1,h2,h3,h4;u32 nblocks;unsigned char buf[64];int count;} SHA1_CONTEXT;voidsha1_init( SHA1_CONTEXT *hd ){hd->h0 = 0x67452301;hd->h1 = 0xefcdab89;hd->h2 = 0x98badcfe;hd->h3 = 0x10325476;hd->h4 = 0xc3d2e1f0;hd->nblocks = 0;hd->count = 0;}/***************** Transform the message X which consists of 16 32-bit-words*/static voidtransform( SHA1_CONTEXT *hd, unsigned char *data ){u32 a,b,c,d,e,tm;u32 x[16];/* get values from the chaining vars */a = hd->h0;b = hd->h1;c = hd->h2;d = hd->h3;e = hd->h4;#ifdef BIG_ENDIAN_HOSTmemcpy( x, data, 64 );#else{int i;unsigned char *p2;for(i=0, p2=(unsigned char*)x; i < 16; i++, p2 += 4 ) {p2[3] = *data++;p2[2] = *data++;p2[1] = *data++;p2[0] = *data++;}}#endif#define K1 0x5A827999L#define K2 0x6ED9EBA1L#define K3 0x8F1BBCDCL#define K4 0xCA62C1D6L#define F1(x,y,z) ( z ^ ( x & ( y ^ z ) ) )#define F2(x,y,z) ( x ^ y ^ z )#define F3(x,y,z) ( ( x & y ) | ( z & ( x | y ) ) )#define F4(x,y,z) ( x ^ y ^ z )#define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] \^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f] \, (x[i&0x0f] = rol(tm,1)) )#define R(a,b,c,d,e,f,k,m) do { e += rol( a, 5 ) \+ f( b, c, d ) \+ k \+ m; \b = rol( b, 30 ); \} while(0)R( a, b, c, d, e, F1, K1, x[ 0] );R( e, a, b, c, d, F1, K1, x[ 1] );R( d, e, a, b, c, F1, K1, x[ 2] );R( c, d, e, a, b, F1, K1, x[ 3] );R( b, c, d, e, a, F1, K1, x[ 4] );R( a, b, c, d, e, F1, K1, x[ 5] );R( e, a, b, c, d, F1, K1, x[ 6] );R( d, e, a, b, c, F1, K1, x[ 7] );R( c, d, e, a, b, F1, K1, x[ 8] );R( b, c, d, e, a, F1, K1, x[ 9] );R( a, b, c, d, e, F1, K1, x[10] );R( e, a, b, c, d, F1, K1, x[11] );R( d, e, a, b, c, F1, K1, x[12] );R( c, d, e, a, b, F1, K1, x[13] );R( b, c, d, e, a, F1, K1, x[14] );R( a, b, c, d, e, F1, K1, x[15] );R( e, a, b, c, d, F1, K1, M(16) );R( d, e, a, b, c, F1, K1, M(17) );R( c, d, e, a, b, F1, K1, M(18) );R( b, c, d, e, a, F1, K1, M(19) );R( a, b, c, d, e, F2, K2, M(20) );R( e, a, b, c, d, F2, K2, M(21) );R( d, e, a, b, c, F2, K2, M(22) );R( c, d, e, a, b, F2, K2, M(23) );R( b, c, d, e, a, F2, K2, M(24) );R( a, b, c, d, e, F2, K2, M(25) );R( e, a, b, c, d, F2, K2, M(26) );R( d, e, a, b, c, F2, K2, M(27) );R( c, d, e, a, b, F2, K2, M(28) );R( b, c, d, e, a, F2, K2, M(29) );R( a, b, c, d, e, F2, K2, M(30) );R( e, a, b, c, d, F2, K2, M(31) );R( d, e, a, b, c, F2, K2, M(32) );R( c, d, e, a, b, F2, K2, M(33) );R( b, c, d, e, a, F2, K2, M(34) );R( a, b, c, d, e, F2, K2, M(35) );R( e, a, b, c, d, F2, K2, M(36) );R( d, e, a, b, c, F2, K2, M(37) );R( c, d, e, a, b, F2, K2, M(38) );R( b, c, d, e, a, F2, K2, M(39) );R( a, b, c, d, e, F3, K3, M(40) );R( e, a, b, c, d, F3, K3, M(41) );R( d, e, a, b, c, F3, K3, M(42) );R( c, d, e, a, b, F3, K3, M(43) );R( b, c, d, e, a, F3, K3, M(44) );R( a, b, c, d, e, F3, K3, M(45) );R( e, a, b, c, d, F3, K3, M(46) );R( d, e, a, b, c, F3, K3, M(47) );R( c, d, e, a, b, F3, K3, M(48) );R( b, c, d, e, a, F3, K3, M(49) );R( a, b, c, d, e, F3, K3, M(50) );R( e, a, b, c, d, F3, K3, M(51) );R( d, e, a, b, c, F3, K3, M(52) );R( c, d, e, a, b, F3, K3, M(53) );R( b, c, d, e, a, F3, K3, M(54) );R( a, b, c, d, e, F3, K3, M(55) );R( e, a, b, c, d, F3, K3, M(56) );R( d, e, a, b, c, F3, K3, M(57) );R( c, d, e, a, b, F3, K3, M(58) );R( b, c, d, e, a, F3, K3, M(59) );R( a, b, c, d, e, F4, K4, M(60) );R( e, a, b, c, d, F4, K4, M(61) );R( d, e, a, b, c, F4, K4, M(62) );R( c, d, e, a, b, F4, K4, M(63) );R( b, c, d, e, a, F4, K4, M(64) );R( a, b, c, d, e, F4, K4, M(65) );R( e, a, b, c, d, F4, K4, M(66) );R( d, e, a, b, c, F4, K4, M(67) );R( c, d, e, a, b, F4, K4, M(68) );R( b, c, d, e, a, F4, K4, M(69) );R( a, b, c, d, e, F4, K4, M(70) );R( e, a, b, c, d, F4, K4, M(71) );R( d, e, a, b, c, F4, K4, M(72) );R( c, d, e, a, b, F4, K4, M(73) );R( b, c, d, e, a, F4, K4, M(74) );R( a, b, c, d, e, F4, K4, M(75) );R( e, a, b, c, d, F4, K4, M(76) );R( d, e, a, b, c, F4, K4, M(77) );R( c, d, e, a, b, F4, K4, M(78) );R( b, c, d, e, a, F4, K4, M(79) );/* Update chaining vars */hd->h0 += a;hd->h1 += b;hd->h2 += c;hd->h3 += d;hd->h4 += e;}/* Update the message digest with the contents* of INBUF with length INLEN.*/static voidsha1_write( SHA1_CONTEXT *hd, unsigned char *inbuf, size_t inlen) {if( hd->count == 64 ) { /* flush the buffer */transform( hd, hd->buf );hd->count = 0;hd->nblocks++;}if( !inbuf )return;if( hd->count ) {for( ; inlen && hd->count < 64; inlen-- )hd->buf[hd->count++] = *inbuf++;sha1_write( hd, NULL, 0 );if( !inlen )return;}while( inlen >= 64 ) {transform( hd, inbuf );hd->count = 0;hd->nblocks++;inlen -= 64;inbuf += 64;}for( ; inlen && hd->count < 64; inlen-- )hd->buf[hd->count++] = *inbuf++;}/* The routine final terminates the computation and* returns the digest.* The handle is prepared for a new cycle, but adding bytes to the* handle will the destroy the returned buffer.* Returns: 20 bytes representing the digest.*/static voidsha1_final(SHA1_CONTEXT *hd){u32 t, msb, lsb;unsigned char *p;sha1_write(hd, NULL, 0); /* flush */;t = hd->nblocks;/* multiply by 64 to make a byte count */lsb = t << 6;msb = t >> 26;/* add the count */t = lsb;if( (lsb += hd->count) < t )msb++;/* multiply by 8 to make a bit count */t = lsb;lsb <<= 3;msb <<= 3;msb |= t >> 29;if( hd->count < 56 ) { /* enough room */hd->buf[hd->count++] = 0x80; /* pad */while( hd->count < 56 )hd->buf[hd->count++] = 0; /* pad */}else { /* need one extra block */hd->buf[hd->count++] = 0x80; /* pad character */while( hd->count < 64 )hd->buf[hd->count++] = 0;sha1_write(hd, NULL, 0); /* flush */;memset(hd->buf, 0, 56 ); /* fill next block with zeroes */}/* append the 64 bit count */hd->buf[56] = msb >> 24;hd->buf[57] = msb >> 16;hd->buf[58] = msb >> 8;hd->buf[59] = msb ;hd->buf[60] = lsb >> 24;hd->buf[61] = lsb >> 16;hd->buf[62] = lsb >> 8;hd->buf[63] = lsb ;transform( hd, hd->buf );p = hd->buf;#ifdef BIG_ENDIAN_HOST#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)#else /* little endian */#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16; \*p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)#endifX(0);X(1);X(2);X(3);X(4);#undef X}控制台调⽤函数:/*输出⽂件的SHA1值* FileNameInPut:⽂件路径*/void GetFileSHA1(char *FileNameInPut){if(FileNameInPut==NULL){printf("\nUsage:\n <EXEFILE> <FILENAME>\n ");return;}FILE *fp;char buffer[4096];size_t n;SHA1_CONTEXT ctx;int i;fopen_s (&fp, FileNameInPut, "rb");if (!fp){printf("打开⽂件“%s”失败\n", FileNameInPut);return;}sha1_init (&ctx);while ( (n = fread (buffer, 1, sizeof buffer, fp))) sha1_write (&ctx, (unsigned char *)buffer, n); if (ferror (fp)){printf("读取⽂件“%s”失败\n", FileNameInPut);return;}sha1_final (&ctx);fclose (fp);for ( i=0; i < 20; i++){printf("%02x",ctx.buf[i]);}}适合程序中调⽤的返回值⽅式:/*获取⽂件的SHA1值,假设错误发⽣则将错误信息写⼊outError* FileNameInPut:⽂件路径* outSHA1:SHA1输出变量* outError:错误信息输出变量* returns:outSHA1*/char *GetFileSHA1(char *FileNameInPut, char *outSHA1, char *outError){if(FileNameInPut==NULL){if (outError != NULL){sprintf(outError, "%s", "FileNameInPut Is NULL");}return outSHA1;}FILE *fp;char buffer[4096];size_t n;SHA1_CONTEXT ctx;int i;fopen_s (&fp, FileNameInPut, "rb");if (!fp){if (outError != NULL){sprintf(outError, "打开⽂件“%s”失败\n", FileNameInPut);}return outSHA1;}sha1_init (&ctx);while ( (n = fread (buffer, 1, sizeof buffer, fp))) sha1_write (&ctx, (unsigned char *)buffer, n);if (ferror (fp)){if (outError != NULL){sprintf(outError, "读取⽂件“%s”失败\n", FileNameInPut);}return outSHA1;}sha1_final (&ctx);fclose (fp);for ( i=0; i < 20; i++){sprintf(outSHA1 + 2*i, "%02x", (unsigned char)ctx.buf[i]);}outSHA1[2*i] = '\0';return outSHA1;}⽔平有限,此⽅法仅仅是简单的实现,还有些问题没有解决,希望⾼⼿指点⼀⼆。
哈希表及其常用算法(代码实例)
![哈希表及其常用算法(代码实例)](https://img.taocdn.com/s3/m/21980f62a88271fe910ef12d2af90242a895abcc.png)
哈希表及其常⽤算法(代码实例)<hash表的特性>Hash 表是使⽤ O(1) 时间进⾏数据的插⼊删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最或者最⼩数据的时间是 O(N) 。
<寻址和 hash 函数>理想状态下 hash ⾜够⼤,每⼀数据保存在⼀个 hash 存储单元内,这样对于插⼊删除和查找某⼀个数据就可以直接得到。
但是现实情况下 hash 表不可能⽆限⼤,⽽且理论上保存的数据的个数是没有限制的,这样保存的数据的数量就远远⼤于 hash 表的存储单元的数量。
为了实现在 O(1) 内对数据进⾏插⼊删除和查找,就必须将⼀个数据映射到 hash 表中的固定位置,这个映射函数就是 hash 函数。
Hash 函数通过对数据进⾏计算得到⼀个在 hash 表中的位置地址。
图 1.1 理想的 hash 表要选择较好的 hash 函数,以及 hash 表存储单元的数量,这样才能使保存在 hash 表中的数据均匀分布。
理想状态不太可能实现,由于存储的数据数量远远⼤于 hash 表存储单元的数量,所以再好的 hash 函数也可能使不同的数据得到相同的映射位置,这就造成了冲突。
但是好的 hash 函数可以将这种冲突降到最低。
<分离链接>解决这种冲突的第⼀种⽅法是借助链表来实现,就是将数据实际存放在与 hash 表存储单元相链接的链表中,⽽不是 hash 的存储单元中。
图 2.1 分离链表当产⽣冲突的时候,将两个数据都链接在同⼀ hash 存储单元保存的链表中。
当⼀个存储单元保存的链表中有多个数据的时候,对于链表后⾯的数据的查找添加和删除就是不是严格意义上的 O(1) 了。
⼀个好的 hash 函数可以使得这个链表很短。
最坏情况下,当所有的数据都保存在⼀个 hash 单元指定的链表中的时候,那么这个 hash 就和链表⼀样了。
<开放地址>使⽤开放地址⽅法解决冲突的时候,数据仍然保存在 hash 表的存储单元中,但是当冲突发⽣的时候,要再次计算新的地址。
c语言调用哈希算法
![c语言调用哈希算法](https://img.taocdn.com/s3/m/4d3f1003e55c3b3567ec102de2bd960590c6d9cb.png)
在C语言中,可以使用哈希算法来生成固定长度的哈希值,用于快速比较、存储和检索数据。
常用的哈希算法有MD5、SHA-1、SHA-256等。
下面是一个简单的示例代码,演示如何使用C语言调用哈希算法。
```c#include <stdio.h>#include <string.h>#include <openssl/sha.h>int main() {char *str = "Hello, world!";unsigned char hash[SHA256_DIGEST_LENGTH];// 调用SHA-256哈希算法生成哈希值SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, str, strlen(str));SHA256_Final(hash, &sha256);// 输出哈希值printf("Hash value: ");for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {printf("%02x", hash[i]);}printf("\n");return 0;}```在上面的代码中,我们使用了OpenSSL库中的SHA256哈希算法。
首先定义了一个字符串`str`,然后声明了一个长度为SHA256_DIGEST_LENGTH的哈希值数组`hash`,用于存储生成的哈希值。
接着,我们初始化了一个SHA256上下文`sha256`,并使用`SHA256_Update`函数将要哈希的数据传送给算法引擎进行哈希运算。
最后,使用`SHA256_Final`函数将哈希结果保存到`hash`数组中。
最后,我们使用`printf`函数输出生成的哈希值。
C语言中的哈希表算法实现
![C语言中的哈希表算法实现](https://img.taocdn.com/s3/m/39ba0b0b0a4c2e3f5727a5e9856a561252d321b2.png)
C语言中的哈希表算法实现哈希表是一种常用的数据结构,它能够快速地存储和检索键值对。
在C语言中,哈希表的实现可以通过使用哈希函数将键映射为索引,再将键值对存储在相应的索引位置上。
本文将介绍C语言中哈希表算法的实现原理及相应的代码示例。
一、哈希函数的选择哈希函数是哈希表算法的核心,它将键映射为哈希值。
合适的哈希函数应具备以下特点:1. 高效性:哈希函数的计算速度应尽可能快速,以保证整个哈希表的性能;2. 均匀性:哈希函数的输出应均匀分布,避免过多的冲突;3. 独立性:哈希函数的输出应与键值的顺序和大小无关。
通常,常见的哈希函数包括除法取余法、乘法散列法和位运算法等。
下面以除法取余法为例,介绍哈希函数的实现。
```cunsigned int hash_function(int key, int size) {return key % size;}```二、哈希表的实现在C语言中,哈希表通常使用数组和链表结合的方式来实现。
每个数组元素对应一个链表,用于存储哈希冲突时的键值对。
首先,我们需要定义哈希表的结构。
其中包括哈希表的大小、数组指针和链表结构等。
```c#define TABLE_SIZE 100typedef struct Node {int key;int value;struct Node* next;} Node;typedef struct HashTable {Node* array[TABLE_SIZE];} HashTable;```接下来,我们需要实现初始化哈希表、插入键值对、删除键值对和查找键值对等基本操作。
1. 初始化哈希表```cHashTable* create_hash_table() {HashTable* hash_table = (HashTable*)malloc(sizeof(HashTable)); for (int i = 0; i < TABLE_SIZE; i++) {hash_table->array[i] = NULL;}return hash_table;}```2. 插入键值对```cvoid insert(HashTable* hash_table, int key, int value) {unsigned int index = hash_function(key, TABLE_SIZE);Node* new_node = (Node*)malloc(sizeof(Node));new_node->key = key;new_node->value = value;new_node->next = NULL;if (hash_table->array[index] == NULL) {hash_table->array[index] = new_node;} else {Node* curr = hash_table->array[index];while (curr->next != NULL) {curr = curr->next;}curr->next = new_node;}}```3. 删除键值对```cvoid delete(HashTable* hash_table, int key) {unsigned int index = hash_function(key, TABLE_SIZE); Node* curr = hash_table->array[index];Node* prev = NULL;while (curr != NULL && curr->key != key) {prev = curr;curr = curr->next;}if (curr == NULL) {return;}if (prev == NULL) {hash_table->array[index] = curr->next;} else {prev->next = curr->next;}free(curr);}```4. 查找键值对```cint find(HashTable* hash_table, int key) {unsigned int index = hash_function(key, TABLE_SIZE); Node* curr = hash_table->array[index];while (curr != NULL) {if (curr->key == key) {return curr->value;}curr = curr->next;}return -1;}```三、总结本文介绍了C语言中哈希表算法的实现原理及相应的代码示例。
变色龙哈希函数代码
![变色龙哈希函数代码](https://img.taocdn.com/s3/m/d2b57c3e1611cc7931b765ce05087632311274bb.png)
变色龙哈希函数代码1.引言概述部分的内容可以根据变色龙哈希函数的背景和概念来进行描述。
下面是一个参考的示例:1.1 概述变色龙哈希函数是一种近年来兴起的密码学哈希函数算法,其独特的设计思想使得它在数据完整性验证、数字签名和密码学随机数生成等领域具有广泛的应用。
与传统的哈希函数相比,变色龙哈希函数能够提供更高的安全性和更强的可抗攻击性。
变色龙哈希函数的名称源于变色龙这一寓意丰富的动物,在自然界中变色龙拥有多种颜色的皮肤,可以根据周围环境的变化进行变色,从而达到自我保护的目的。
类似地,变色龙哈希函数通过使用多个内部参数,根据输入数据的不同而产生不同的输出结果,从而增加了其对抗各种攻击的能力。
与传统的哈希函数只有一个单一的输出不同,变色龙哈希函数通过使用伪随机性和自适应性等技术,生成多个输出值。
这些输出值可以分别应用于数据完整性验证、数字签名和密码学随机数生成等场景,可以满足不同应用场景的需求。
在本文中,我们将详细介绍变色龙哈希函数的原理和实现方法。
首先,我们将探讨变色龙哈希函数的原理,包括其使用的多种内部参数和生成多个输出值的机制。
接着,我们将介绍变色龙哈希函数的具体实现方法,包括各种常用的变色龙哈希函数算法和它们的特点。
最后,我们将对变色龙哈希函数进行总结,并展望其在未来的发展前景。
通过深入理解变色龙哈希函数的原理和实现方法,我们可以更好地应用它来保护数据的完整性和安全性,为信息安全领域的发展做出贡献。
文章结构部分的内容如下:1.2 文章结构本篇文章主要分为三个部分,分别是引言、正文和结论。
引言部分将提供对变色龙哈希函数的概述,介绍其基本原理和目的。
同时,为读者说明文章的结构和内容安排,为后续的阅读提供指导。
正文部分将分为两个小节,分别是对变色龙哈希函数原理和实现的详细介绍。
在2.1小节中,将对变色龙哈希函数的原理进行解释,包括其工作原理、核心思想以及与传统哈希函数的比较。
而在2.2小节中,将详细介绍变色龙哈希函数的实现方法,包括其代码实现和具体应用场景的案例分析。
C语言实现MD5算法
![C语言实现MD5算法](https://img.taocdn.com/s3/m/31e92e3d26284b73f242336c1eb91a37f0113251.png)
C语言实现MD5算法1.理解MD5算法原理:-MD5算法是一种常用的哈希函数,用于将任意长度的消息转换为固定长度的哈希值,通常为128位。
-MD5算法主要包括四个循环运算和四个非线性函数,通过迭代运算将输入的消息分块处理并输出最终的哈希值。
2.定义MD5算法所需的常量和函数:-定义一个64个元素的常数列表,用于在算法运算中使用。
-定义四个非线性的F,G,H,I函数,用于在循环运算中使用。
3.定义MD5算法所需的全局变量:-定义一个128位的缓冲区保存最终输出的哈希值。
-定义一个64位的计数指示器,记录输入消息的长度。
-定义四个32位的寄存器变量A、B、C、D,用于循环运算过程中保存中间结果。
4.实现MD5算法的主要函数:- 实现Padding函数,将输入消息按照MD5算法的规则进行填充,使其长度满足对512位的整数倍。
-实现FF,GG,HH,II四个函数,用于在每个循环运算中进行非线性转换。
-实现MD5算法的核心循环函数,将输入消息分块处理,并对每个分块进行四轮循环运算,更新寄存器变量的值。
-实现MD5算法的输出函数,将最终运算得到的寄存器变量的值按照一定顺序连接起来,得到最终的128位哈希值。
5.实现MD5算法的入口函数:- 在main函数中,读取输入消息,并调用MD5算法的相关函数,得到最终的哈希值。
-打印输出哈希值。
以下为C语言实现MD5算法的伪代码:```c//定义MD5算法所需的常量和函数const uint32_t s[64] = { ... }; // 常数表const uint32_t k[64] = { ... }; // F,G,H,I函数对应的逻辑常数uint32_t F(uint32_t x, uint32_t y, uint32_t z) { ... } // F 函数uint32_t G(uint32_t x, uint32_t y, uint32_t z) { ... } // G 函数uint32_t H(uint32_t x, uint32_t y, uint32_t z) { ... } // H 函数uint32_t I(uint32_t x, uint32_t y, uint32_t z) { ... } // I 函数//定义MD5算法所需的全局变量uint32_t buffer[4]; // 128位缓冲区uint64_t count = 0; // 输入消息的长度uint32_t A, B, C, D; // 寄存器变量// 实现Padding函数void padding(char* message) { ... }//实现FF,GG,HH,II四个函数void FF(...) { ... }void GG(...) { ... }void HH(...) { ... }void II(...) { ... }//实现MD5算法的核心循环函数void MD5Block(uint32_t* block) { ... }//实现MD5算法的输出函数void MD5Output(uint32_t* digest) { ... }//实现MD5算法的入口函数int maichar message[MAX_LENGTH];uint32_t digest[4];//读取输入消息gets(message);//填充输入消息padding(message);//分块处理for (uint32_t i = 0; i < count; i += 64)MD5Block(&message[i]);}//输出最终结果MD5Output(digest);//打印哈希值printf("%08x%08x%08x%08x", digest[0], digest[1], digest[2], digest[3]);return 0;```以上是一个简单的伪代码,实现了C语言下的MD5算法。
c++标准库哈希函数
![c++标准库哈希函数](https://img.taocdn.com/s3/m/53ed6728974bcf84b9d528ea81c758f5f61f2981.png)
c++标准库哈希函数
哈希函数是一种将输入映射到固定范围的输出的函数。
在C++标准库中,哈希函数被用于unordered_map、unordered_set等容器中,用于将元素从一个键值映射到另一个位置。
C++标准库中有多个哈希函数可供选择,包括:
1. std::hash:这是一个通用哈希函数,可用于任何类型的数据。
它将输入的数据转换为一个哈希值,该哈希值可用于将元素添加到哈希表中。
2. std::hash_combine:这是一个辅助函数,可用于将多个哈希值组合成一个哈希值。
它通常用于将不同的数据类型组合成一个键。
3. std::hash<std::string>:这是专门为字符串设计的哈希函数。
它将字符串转换为哈希值,然后将哈希值用于将字符串添加到哈希表中。
4. std::hash<int>:这是专门为整数设计的哈希函数。
它将整数转换为哈希值,然后将哈希值用于将整数添加到哈希表中。
在使用哈希函数时,还需要注意以下几点:
1. 哈希函数应该具有良好的分布性,即不同的输入应该被映射到不同的哈希值上,以避免哈希冲突。
2. 哈希函数应该高效,即计算哈希值的时间应该尽量短。
3. 哈希函数应该是确定性的,即对于相同的输入,应该始终产生相同的哈希值。
总之,哈希函数是C++标准库中非常重要的一部分,它们使得
unordered_map、unordered_set等容器能够高效地存储和访问元素。
在使用这些容器时,我们应该选择适合当前数据类型和使用场景的哈希函数,并注意哈希函数的分布性、效率和确定性。
c 语言实现 sh a-1 算法,对一段明文进行运算得出对应的 hash 值。
![c 语言实现 sh a-1 算法,对一段明文进行运算得出对应的 hash 值。](https://img.taocdn.com/s3/m/9d2645e40129bd64783e0912a216147916117e6b.png)
下面是一个使用C语言实现SHA-1算法的示例代码:```c#include <stdio.h>#include <stdint.h>#include <string.h>#include <stdlib.h>// 定义 SHA-1 中使用到的常量#define SHA1_ROL32(x, n) (((x) << (n)) | ((x) >> (32 - (n))))#define SHA1_BLK0(i) (block->l[i] = (SHA1_ROL32(block->l[i], 24) & 0xFF00FF00) | (SHA1_ROL32(block->l[i], 8) & 0x00FF00FF))#define SHA1_BLK(i) (block->l[i & 15] = SHA1_ROL32(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))#define SHA1_R0(v, w, x, y, z, i) z += ((w & (x ^ y)) ^ y) + SHA1_BLK0(i) + 0x5A827999 + SHA1_ROL32(v, 5); w = SHA1_ROL32(w, 30);#define SHA1_R1(v, w, x, y, z, i) z += ((w & (x ^ y)) ^ y) + SHA1_BLK(i) + 0x5A827999 + SHA1_ROL32(v, 5); w = SHA1_ROL32(w, 30);#define SHA1_R2(v, w, x, y, z, i) z += (w ^ x ^ y) + SHA1_BLK(i) + 0x6ED9EBA1 + SHA1_ROL32(v, 5); w = SHA1_ROL32(w, 30);#define SHA1_R3(v, w, x, y, z, i) z += (((w | x) & y) | (w & x)) + SHA1_BLK(i) +0x8F1BBCDC + SHA1_ROL32(v, 5); w = SHA1_ROL32(w, 30);#define SHA1_R4(v, w, x, y, z, i) z += (w ^ x ^ y) + SHA1_BLK(i) + 0xCA62C1D6 + SHA1_ROL32(v, 5); w = SHA1_ROL32(w, 30);// 结构体,用于保存 SHA-1 计算过程中的中间状态typedef struct {uint32_t state[5];uint32_t count[2];unsigned char buffer[64];} SHA1_CTX;// 函数声明void sha1_transform(SHA1_CTX *ctx, const unsigned char *buffer);void sha1_init(SHA1_CTX *ctx);void sha1_update(SHA1_CTX *ctx, const unsigned char *data, size_t len);void sha1_final(unsigned char digest[20], SHA1_CTX *ctx);// SHA-1 转换函数void sha1_transform(SHA1_CTX *ctx, const unsigned char *buffer) {uint32_t a, b, c, d, e;typedef union {unsigned char c[64];uint32_t l[16];} CHAR64LONG16;CHAR64LONG16 *block;block = (CHAR64LONG16 *) buffer;// 保存当前状态a = ctx->state[0];b = ctx->state[1];c = ctx->state[2];d = ctx->state[3];e = ctx->state[4];// 进行 80 轮运算SHA1_R0(a, b, c, d, e, 0);SHA1_R0(e, a, b, c, d, 1);SHA1_R0(d, e, a, b, c, 2);SHA1_R0(c, d, e, a, b, 3);SHA1_R0(b, c, d, e, a, 4);SHA1_R0(a, b, c, d, e, 5);SHA1_R0(e, a, b, c, d, 6);SHA1_R0(d, e, a, b, c, 7);SHA1_R0(c, d, e, a, b, 8);SHA1_R0(b, c, d, e, a, 9);SHA1_R0(a, b, c, d, e, 10);SHA1_R0(e, a, b, c, d, 11);SHA1_R0(d, e, a, b, c, 12);SHA1_R0(c, d, e, a, b, 13);SHA1_R0(b, c, d, e, a, 14);SHA1_R0(a, b, c, d, e, 15);SHA1_R1(e, a, b, c, d, 16);SHA1_R1(d, e, a, b, c, 17);SHA1_R1(c, d, e, a, b, 18);SHA1_R1(b, c, d, e, a, 19);SHA1_R2(a, b, c, d, e, 20);SHA1_R2(e, a, b, c, d, 21);SHA1_R2(d, e, a, b, c, 22);SHA1_R2(c, d, e, a, b, 23);SHA1_R2(b, c, d, e, a, 24);SHA1_R2(a, b, c, d, e, 25);SHA1_R2(e, a, b, c, d, 26);SHA1_R2(d, e, a, b, c, 27);SHA1_R2(c, d, e, a, b, 28);SHA1_R2(b, c, d, e, a, 29);SHA1_R2(a, b, c, d, e, 30);SHA1_R2(d, e, a, b, c, 32); SHA1_R2(c, d, e, a, b, 33); SHA1_R2(b, c, d, e, a, 34); SHA1_R2(a, b, c, d, e, 35); SHA1_R2(e, a, b, c, d, 36); SHA1_R2(d, e, a, b, c, 37); SHA1_R2(c, d, e, a, b, 38); SHA1_R2(b, c, d, e, a, 39);SHA1_R3(a, b, c, d, e, 40); SHA1_R3(e, a, b, c, d, 41); SHA1_R3(d, e, a, b, c, 42); SHA1_R3(c, d, e, a, b, 43); SHA1_R3(b, c, d, e, a, 44); SHA1_R3(a, b, c, d, e, 45); SHA1_R3(e, a, b, c, d, 46); SHA1_R3(d, e, a, b, c, 47); SHA1_R3(c, d, e, a, b, 48); SHA1_R3(b, c, d, e, a, 49); SHA1_R3(a, b, c, d, e, 50); SHA1_R3(e, a, b, c, d, 51); SHA1_R3(d, e, a, b, c, 52); SHA1_R3(c, d, e, a, b, 53); SHA1_R3(b, c, d, e, a, 54); SHA1_R3(a, b, c, d, e, 55); SHA1_R3(e, a, b, c, d, 56); SHA1_R3(d, e, a, b, c, 57); SHA1_R3(c, d, e, a, b, 58); SHA1_R3(b, c, d, e, a, 59);SHA1_R4(a, b, c, d, e, 60); SHA1_R4(e, a, b, c, d, 61); SHA1_R4(d, e, a, b, c, 62); SHA1_R4(c, d, e, a, b, 63); SHA1_R4(b, c, d, e, a, 64); SHA1_R4(a, b, c, d, e, 65); SHA1_R4(e, a, b, c, d, 66); SHA1_R4(d, e, a, b, c, 67); SHA1_R4(c, d, e, a, b, 68); SHA1_R4(b, c, d, e, a, 69); SHA1_R4(a, b, c, d, e, 70); SHA1_R4(e, a, b, c, d, 71); SHA1_R4(d, e, a, b, c, 72);SHA1_R4(b, c, d, e, a, 74);SHA1_R4(a, b, c, d, e, 75);SHA1_R4(e, a, b, c, d, 76);SHA1_R4(d, e, a, b, c, 77);SHA1_R4(c, d, e, a, b, 78);SHA1_R4(b, c, d, e, a, 79);// 更新状态ctx->state[0] += a;ctx->state[1] += b;ctx->state[2] += c;ctx->state[3] += d;ctx->state[4] += e;// 清空缓冲区memset(block, 0, sizeof(CHAR64LONG16));}// SHA-1 初始化函数void sha1_init(SHA1_CTX *ctx) {ctx->count[0] = ctx->count[1] = 0;ctx->state[0] = 0x67452301;ctx->state[1] = 0xEFCDAB89;ctx->state[2] = 0x98BADCFE;ctx->state[3] = 0x10325476;ctx->state[4] = 0xC3D2E1F0;}// SHA-1 更新函数void sha1_update(SHA1_CTX *ctx, const unsigned char *data, size_t len) { size_t i;for (i = 0; i < len; ++i) {ctx->buffer[ctx->count[0] & 63] = data[i];if ((++ctx->count[0]) == 0)++ctx->count[1];if ((ctx->count[0] & 63) == 0)sha1_transform(ctx, ctx->buffer);}}// SHA-1 结果输出函数void sha1_final(unsigned char digest[20], SHA1_CTX *ctx) {uint32_t i;unsigned char finalcount[8]; for (。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while (*str)
{
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
return (hash & 0x7FFFFFFF);
}
// P. J. Weinberger Hash
unsigned int PJWHash(char *str)
{
unsigned int hash = 0;
int i;
for (i=0; *str; i++)
{
if ((i & 1) == 0)
{
hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
}
else
{
- OneEighth);
unsigned int hash = 0;
unsigned int test = 0;
while (*str)
{
hash = (hash << OneEighth) + (*str++);
if ((test = hash & HighBits) != 0)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
hash = (hash << 4) + (*str++);
if ((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
}
}
return (hash & 0x7FFFFFFF);
}
unsigned int hash = 0;
while (*str)
{
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);
}
// DJB Hash
unsigned int DJBHash(char *str)
{
unsigned int hash = 5381;
while (*str)
{
hash += (hash << 5) + (*str++);
}
return (hash & 0x7FFFFFFF);
}
// AP Hash
unsigned int APHash(char *str)
{
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
}
return (hash & 0x7FFFFFFF);
}
// ELF Hash
unsigned int ELFHash(char *str)
{
unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
unsigned int ThreeQuarters = (unsigned int)((BitsInUnignedInt * 3) / 4);
while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7FFFFFFF);
}
// JS Hash
unsigned int JSHash(char *str)
{
unsigned iห้องสมุดไป่ตู้t hash = 1315423911;
附:各种哈希函数的C语言程序代码
{
unsigned int hash = 0;
while (*str)
{
// equivalent to: hash = 65599*hash + (*str++);
hash = (*str++) + (hash << 6) + (hash << 16) - hash;
hash &= ~x;
}
}
return (hash & 0x7FFFFFFF);
}
// BKDR Hash
unsigned int BKDRHash(char *str)
{
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
unsigned int OneEighth = (unsigned int)(BitsInUnignedInt / 8);
unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt unsigned int SDBMHash(char *str)
}
return (hash & 0x7FFFFFFF);
}
// RS Hash
unsigned int RSHash(char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;