C语言中的hash函数

C语言中的hash函数,第1张

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数

HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。Hash算法在信息安全方面的应用主要体现在以下的3个方面:文件校验、数字签名、鉴权协议

程程序实现

// 说明:Hash函数(即散列函数)在程序设计中的应用目标 ------ 把一个对象通过某种转换机制对应到一个

//size_t类型(即unsigned long)的整型值。

// 而应用Hash函数的领域主要是 hash表(应用非常广)、密码等领域。

// 实现说明:

// ⑴、这里使用了函数对象以及泛型技术,使得对所有类型的对象(关键字)都适用。

// ⑵、常用类型有对应的偏特化,比如string、char、各种整形等。

// ⑶、版本可扩展,如果你对某种类型有特殊的需要,可以在后面实现专门化。

// ⑷、以下实现一般放在头文件中,任何包含它的都可使用hash函数对象。

//------------------------------------实现------------------------------------------------

#include <string>

using std::string;

inlinesize_thash_str(const char s)

{

unsigned long res = 0;

for (; s; ++s)

res = 5 res + s;

returnsize_t(res);

}

template <class Key>

struct hash

{

size_toperator () (const Key& k) const;

};

// 一般的对象,比如:vector< queue<string> >;的对象,需要强制转化

template < class Key >

size_thash<Key>::operator () (const Key& k) const

{

size_tres = 0;

size_tlen = sizeof(Key);

const char p = reinterpret_cast<const char>(&k);

while (len--)

{

res = (res<<1)^p++;

}

return res;

}

// 偏特化

template<>

size_thash< string >::operator () (const string& str) const

{

return hash_str(strc_str());

}

typedef char PChar;

template<>

size_thash<PChar>::operator () (const PChar& s) const

{

return hash_str(s);

}

typedef const char PCChar;

template<>

size_thash<PCChar>::operator () (const PCChar& s) const

{

return hash_str(s);

}

template<> size_t hash<char>::operator () (const char& x) const { return x; }

template<> size_t hash<unsigned char>::operator () (const unsigned char& x) const { return x; }

template<> size_t hash<signed char>::operator () (const signed char& x) const { return x; }

template<> size_t hash<short>::operator () (const short& x) const { return x; }

template<> size_t hash<unsigned short>::operator () (const unsigned short& x) const { return x; }

template<> size_t hash<int>::operator () (const int& x) const { return x; }

template<> size_t hash<unsigned int>::operator () (const unsigned int& x) const { return x; }

template<> size_t hash<long>::operator () (const long& x) const { return x; }

template<> size_t hash<unsigned long>::operator () (const unsigned long& x) const { return x; }

// 使用说明:

//

// ⑴、使用时首先由于是泛型,所以要加上关键字类型。

//

// ⑵、其次要有一个函数对象,可以临时、局部、全局的,只要在作用域就可以。

//

// ⑶、应用函数对象作用于对应类型的对象。

//----------------------- hash函数使用举例 -------------------------

#include <iostream>

#include <vector>

#include <string>

using namespace std;

int main()

{

vector<string> vstr⑵;

vstr[0] = "sjw";

vstr[1] = "suninf";

hash<string> strhash; // 局部函数对象

cout << " Hash value: " << strhash(vstr[0]) << endl;

cout << " Hash value: " << strhash(vstr[1]) << endl;

cout << " Hash value: " << hash< vector<string> >() (vstr) << endl;

cout << " Hash value: " << hash<int>() (100) << endl; // hash<int>() 临时函数对象

return 0;

}

HashSet<String> set=new HashSet<String>();

setadd("1");

setadd("2");

setadd("3");

Iterator<String> iterator=setiterator();

while(iteratorhasNext()){

Systemoutprintln(iteratornext());

}

控制台输出:

3

2

1

对于集合这块的类都可以这样写的,比如你把第一行换成:

ArrayList<String> set=new ArrayList<String>();

后面的程序不动,一样可以遍历输出的。

不太懂的话可以百度Iterator的用法和原理

看了下那个hashcat-gui 已经是很老的东西了,2012325 最后更新出错的话截个图来让大家帮你看看oclHashcat-plus 很久以前叫这个名字,现在都合并到oclHashcat了。你说它是替代版本也没错。他们的区别就是hashcat只支持CPUPJ(多线程) oclHashcat支持GPUPJ运行EXE文件命令行一闪而过你要到命令行下运行,就像这样的格式 c:\testexe 这种或者你到软件目录下,新建一个abat的批处理文件,里面就写cmd,后缀一定要是bat,双击执行就出来cmd,在里面执行软件不清楚EWSA 能否支持R9 270X希望能够帮到你

彩虹表有很多种有专门破解WiFi的WiFi彩虹表你可以搜一下zeroone团队哪个4g的还有33g的哪个现在网上就能找到这两个

cowpatty -d xxxhash -r 1cap -s ESSID

他这个表是hash后缀的。rt rtc rti哪个表不是干这个用的

ZerOne团队4g那个:

33G那个:

这就是用彩虹表破解wifi挺简单的,彩虹表速度也很快,一千万的密码三秒钟就能跑完,要是用aircrack或者hashcat跑要跑一个多小时hashcat能比aircrack快一点,再快也快不过彩虹表,不过这个表有点问题,直接对密码不行吗为什么要加个名字?不过wpa这种格式都是连名字一起算在一起的,没有名字还不行你可以搜一下pkm库哪个也算是彩虹表把,不过这个WiFi彩虹表和其他的不一样这个表具有单一性感觉有点垃圾把,要是别人wifi名字换了你这个表也就废了,要是别人光换个密码还行表还能用这也是缺点把

最主要的还是研究怎么提取密码哈希把,把cap里面的密码哈希提取出来用rti哪个表破解我试过用rti哪个表破解rar速度挺快的11位的纯数字密码两秒就出来了,提取rar密码哈希用rar2john这个软件,看这个软件的名字应该是一个叫赵恩的人发明的,我想问问赵恩大哥哥你能不能发明一下cap2john这个软件专门提取cap密码哈希然后用rti这个表跑一下。

不过wpa这种加密格式好像没有名字不行,所以基本没人做这种wpa彩虹表网上能找到的也就这两个少的可怜,也不知道赵恩大哥哥能不能发明一下cap2john或者wpa2john或者wifi2john如果发明的了应该会好不少,就是不知道提取的md5能不能用rti或者rtc格式的彩虹表破解,如果能破解就能方便很多

反正破解WiFi的彩虹表就那么两个你可以下载体验一下,33g哪个在网上还能找到种子文件,你要是不想用百度盘可以搜索种子用迅雷下载,好处是直接输入cap文件就行不需要md5缺点是需要名字,第二种方法怎么能从cap里面提取密码哈希这个到现在也找不到方法,也不知道赵恩大哥哥什么时候能发明一个cap2john如果这个软件发明出来能提取cap密码哈希就能直接用rti哪个表破解了

Map<User,Socket> socketMap = new HashMap<User,Socket>();

socketMapput(user1,socket1);

socketMapput(user2,socket2);

for (Socket socket: socketMapvalues()) {

}

以上就是关于C语言中的hash函数全部的内容,包括:C语言中的hash函数、java中HashSet怎样遍历取出里面的值给个例子~~、win下hashcat中zip密码的hash值如何获取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10140106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存