Есть ли glibc хэш-функция? - PullRequest
       31

Есть ли glibc хэш-функция?

10 голосов
/ 14 октября 2010

Я ищу реализацию пользовательской хеш-таблицы на C. Есть ли в библиотеке GNU хеш-функция MD5 / SHA1 или мне нужно для этого использовать внешнюю библиотеку?

Вот какчто я ищу:

int hashValue;

hashValue = MD5_HASH(valToHash);

Ответы [ 8 ]

5 голосов
/ 15 октября 2010

Вы можете взглянуть на опрос Боба Дженкина и анализ многих хеш-функций:

Или просто добавьте его подпрограммы lookup3 (которые он поставил в открытый доступ) в ваш проект:

5 голосов
/ 15 октября 2010

Для хеш-таблицы вам не нужна криптографическая стойкость, только хорошие свойства рандомизации.Сломанные криптографические хеш-функции (например, MD5) хороши для этого, но вы можете использовать MD4 , что и быстрее, и проще, до такой степени, что вы можете просто включить реализацию непосредственно в ваш код.Нетрудно переписать его из спецификации (и поскольку вам нужна только функция для хэш-таблицы, на самом деле это не проблема, если вы ошибетесь в какой-то момент).Бесстыдный плагин: оптимизированная реализация MD4 для C в sphlib .

3 голосов
/ 14 октября 2010

Glibc's crypt() использует алгоритм на основе MD5, если соль начинается с $ 1 $. Но так как вы упомянули, что собираетесь реализовать хеш-таблицу, возможно, хеш Дженкинса будет более уместным.

3 голосов
/ 14 октября 2010

Если у вас нет веских причин для использования MD5, вы можете пересмотреть.То, что делает «хорошую» хеш-функцию в хеш-таблице, в значительной степени зависит от того, чего вы пытаетесь достичь.Вы можете прочитать комментарии в dictobject.c Python, чтобы увидеть, какие компромиссы были сделаны другими.

3 голосов
/ 14 октября 2010

Доступно несколько надежных, простых версий - у меня есть несколько источников digest для R .Вот что я написал в файле DESCRIPTION:

Описание: Пакет дайджеста предоставляет функции для создания хеш-дайджестов произвольных объектов R с использованием md5, sha-1, sha-256 иАлгоритмы crc32, позволяющие легко сравнивать объекты языка R.Алгоритм md5 Рона Ривеста определен в RFC 1321, алгоритмы SHA-1 и SHA-256 определены в FIPS-180-1 и FIPS-180-2, а алгоритм crc32 описан в
ftp.: //ftp.rocksoft.com/cliens/rocksoft/papers/crc_v3.txt.Для md5, sha-1 и sha-256 в этих пакетах используются небольшие автономные реализации, которые были предоставлены Christophe Devine.Для crc32 используется код из библиотеки zlib.

Я думаю, что некоторого кода Кристофа больше нет на cr0.net, но поиски должны привести вас к нескольким другим проектам, включающим его.Заголовки его файлов были довольно понятны:

/*                                                   
 * FIPS-180-1 compliant SHA-1 implementation,   
 * by Christophe Devine <devine@cr0.net>;   
 * this program is licensed under the GPL.  
 */     

, а его код соответствует исходному выводу.

2 голосов
/ 07 ноября 2013

gcrypt и openssl могут делать MD5, SHA и другие хеши. Вот пример с libgcrypt:

#include <gcrypt.h>
#include <stdio.h>

//  compile  gcc  md5_test.c  -lgcrypt

int main(int argc, char *argv[])
{
        unsigned char digest[16];
        char digest_ascii[32+1] = {0,};
        int digest_length = gcry_md_get_algo_dlen (GCRY_MD_MD5);
        int i;
        printf("hashing=%s len=%d\n", argv[1], digest_length);
        gcry_md_hash_buffer(GCRY_MD_MD5, digest, argv[1], strlen(argv[1]));

        for (i=0; i < digest_length; i++) {
                sprintf(digest_ascii+(i*2), "%02x", digest[i]);
        }
        printf("hash=%s\n", digest_ascii);
}

`

2 голосов
/ 14 октября 2010

В библиотеке OpenSSL есть все криптографические процедуры, которые вы когда-либо могли захотеть, включая криптографические хеши.

0 голосов
/ 12 апреля 2017

Murmur3 - это быстрый некриптографический алгоритм, который вы можете использовать.

Хорошее сравнение скорости шума по сравнению с другими алгоритмами можно найти в этой теме https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

Одна из возможных реализаций: https://github.com/PeterScott/murmur3

Пример:

uint32_t hash;
uint32_t seed = 42;
char* input = "HelloWorld";

MurmurHash3_x86_32(input, strlen(input), seed, &hash);
printf("x86_32:  %08x\n", hash);
...