当前位置: 首页 > news >正文

分享一个生成哈希值的C代码

代码是我在阅读assimp源码时看到的,不依赖任何第三方,可直接集成。

#pragma once
#ifndef AI_HASH_H_INCLUDED
#define AI_HASH_H_INCLUDED#ifdef __GNUC__
#   pragma GCC system_header
#endif#include <stdint.h>
#include <string.h>
#include <cmath>// ------------------------------------------------------------------------------------------------
// Hashing function taken from
// http://www.azillionmonkeys.com/qed/hash.html
// (incremental version)
//
// This code is Copyright 2004-2008 by Paul Hsieh. It is used here in the belief that
// Assimp's license is considered compatible with Pauls's derivative license as specified
// on his web page.
//
// (stdint.h should have been been included here)
// ------------------------------------------------------------------------------------------------
#undef get16bits
#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \|| defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
#define get16bits(d) (*((const uint16_t *) (d)))
#endif#if !defined (get16bits)
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\+(uint32_t)(((const uint8_t *)(d))[0]) )
#endif// ------------------------------------------------------------------------------------------------
inline uint32_t SuperFastHash (const char * data, uint32_t len = 0, uint32_t hash = 0) {uint32_t tmp;int rem;if (!data) return 0;if (!len)len = (uint32_t)::strlen(data);rem = len & 3;len >>= 2;/* Main loop */for (;len > 0; len--) {hash  += get16bits (data);tmp    = (get16bits (data+2) << 11) ^ hash;hash   = (hash << 16) ^ tmp;data  += 2*sizeof (uint16_t);hash  += hash >> 11;}/* Handle end cases */switch (rem) {case 3: hash += get16bits (data);hash ^= hash << 16;hash ^= abs(data[sizeof(uint16_t)]) << 18;hash += hash >> 11;break;case 2: hash += get16bits (data);hash ^= hash << 11;hash += hash >> 17;break;case 1: hash += *data;hash ^= hash << 10;hash += hash >> 1;}/* Force "avalanching" of final 127 bits */hash ^= hash << 3;hash += hash >> 5;hash ^= hash << 4;hash += hash >> 17;hash ^= hash << 25;hash += hash >> 6;return hash;
}#endif // !! AI_HASH_H_INCLUDED

http://www.lryc.cn/news/237915.html

相关文章:

  • 【Windows 常用工具系列 11 -- 福昕PDF搜索高亮过的文本】
  • (二)汇编语句组成
  • Linux C 网络编程概述
  • 腾讯云标准型s5和s6有什么区别?CPU处理器有差异吗?
  • WPF TextBox实现placeholder
  • UiPath Studio 2023.10 Crack
  • SpringBoot——入门及原理
  • js实现页面滚动时自动切换Sidebar标签,点击标签自动滚动页面
  • Failed to load resource: net::ERR_UPLOAD_FILE_CHANGED 谷歌浏览器就会有这个问题 其他的浏览器没有
  • 微信小程序 prettier 格式化
  • SystemVerilog学习 (10)——线程控制
  • 【开题报告】基于SpringBoot的二手汽车交易平台的设计与实现
  • Python 爬虫入门
  • [ 加密 ] SHA256
  • 推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。
  • 《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar
  • 风丘电动汽车热管理方案 为您的汽车研发保驾护航
  • 每日一练 | 华为认证真题练习Day134
  • python连接hive报错:TypeError: can‘t concat str to bytes
  • 虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火
  • 10 Redis的持久化
  • 【Linux入侵日志排查】
  • 从哪些方面分析Linux内核源码
  • C#WPF数据模板应用实例
  • ansible练习题1
  • 六大排序详讲(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序)
  • Clickhouse初认识
  • 网络安全项目简介
  • CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)
  • semodule工具详解(1)