mirror of
https://github.com/apache/arrow.git
synced 2026-10-28 16:47:19 +08:00
Implements a generic method to retrieve SHA hashes
This commit is contained in:
1 parent
af05c21171
commit
f3e1d13e99
2 files changed
+12
-44
No files matched your search
@@ -5,48 +5,13 @@
|
||||
|
||||
namespace gandiva {
|
||||
const char * HashUtils::hash_using_SHA256(int64_t context, const void *message, size_t message_length) {
|
||||
if(message == nullptr){
|
||||
HashUtils::error_message(context, "A null value was given to be hashed.");
|
||||
return "";
|
||||
}
|
||||
|
||||
EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
|
||||
|
||||
EVP_DigestInit_ex(md_ctx, EVP_sha256(), nullptr);
|
||||
|
||||
EVP_DigestUpdate(md_ctx, message, message_length);
|
||||
|
||||
int sha256_hash_size = EVP_MD_size(EVP_sha256());
|
||||
|
||||
auto* result = static_cast<unsigned char*>(OPENSSL_malloc(sha256_hash_size));
|
||||
|
||||
unsigned int result_length;
|
||||
|
||||
EVP_DigestFinal_ex(md_ctx, result, &result_length);
|
||||
|
||||
char* hex_buffer = new char[4];
|
||||
char* result_buffer = new char[65];
|
||||
|
||||
clean_char_array(hex_buffer);
|
||||
clean_char_array(result_buffer);
|
||||
|
||||
for (unsigned int j = 0; j < result_length; j++) {
|
||||
unsigned char hex_number = result[j];
|
||||
sprintf(hex_buffer, "%02x", hex_number);
|
||||
|
||||
strcat(result_buffer, hex_buffer);
|
||||
}
|
||||
|
||||
result_buffer[64] = '\0';
|
||||
|
||||
// free the resources to avoid memory leaks
|
||||
EVP_MD_CTX_free(md_ctx);
|
||||
delete[] hex_buffer;
|
||||
free(result);
|
||||
|
||||
return result_buffer;
|
||||
return HashUtils::get_hash(context, message, message_length, EVP_sha256());
|
||||
}
|
||||
const char * HashUtils::hash_using_SHA128(int64_t context, const void *message, size_t message_length) {
|
||||
return HashUtils::get_hash(context, message, message_length, EVP_sha1());
|
||||
}
|
||||
|
||||
const char* HashUtils::get_hash(int64_t context, const void *message, size_t message_length, const EVP_MD *hash_type){
|
||||
if(message == nullptr){
|
||||
HashUtils::error_message(context, "A null value was given to be hashed.");
|
||||
return "";
|
||||
@@ -54,13 +19,13 @@ namespace gandiva {
|
||||
|
||||
EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
|
||||
|
||||
EVP_DigestInit_ex(md_ctx, EVP_sha1(), nullptr);
|
||||
EVP_DigestInit_ex(md_ctx, hash_type, nullptr);
|
||||
|
||||
EVP_DigestUpdate(md_ctx, message, message_length);
|
||||
|
||||
int sha128_hash_size = EVP_MD_size(EVP_sha1());
|
||||
int hash_size = EVP_MD_size(hash_type);
|
||||
|
||||
auto* result = static_cast<unsigned char*>(OPENSSL_malloc(sha128_hash_size));
|
||||
auto* result = static_cast<unsigned char*>(OPENSSL_malloc(hash_size));
|
||||
|
||||
unsigned int result_length;
|
||||
|
||||
@@ -89,7 +54,6 @@ namespace gandiva {
|
||||
return result_buffer;
|
||||
}
|
||||
|
||||
|
||||
uint64_t HashUtils::double_to_long(double value) {
|
||||
uint64_t result;
|
||||
memcpy(&result, &value, sizeof(result));
|
||||
|
||||
@@ -4,17 +4,21 @@
|
||||
#include <cstdlib>
|
||||
#include <cstdint>
|
||||
#include "gandiva/visibility.h"
|
||||
#include "openssl/evp.h"
|
||||
|
||||
namespace gandiva {
|
||||
class GANDIVA_EXPORT HashUtils {
|
||||
public:
|
||||
static const char * hash_using_SHA256(int64_t context, const void *message, size_t message_length);
|
||||
|
||||
static const char *hash_using_SHA128(int64_t context, const void *message, size_t message_length);
|
||||
|
||||
static uint64_t double_to_long(double value);
|
||||
private:
|
||||
static inline void clean_char_array(char *buffer);
|
||||
|
||||
static const char *get_hash(int64_t context, const void *message, size_t message_length, const EVP_MD *hash_type);
|
||||
|
||||
static void error_message(int64_t context_ptr, char const *err_msg);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user