我正在尝试编写一个使用哈希表来存储不同单词的C程序,我可以使用一些帮助.
首先,我创建一个哈希表,其中素数的大小最接近我必须存储的单词的数量,然后我使用哈希函数来查找每个单词的地址.我从最简单的功能开始,将字母加在一起,结果是88%的碰撞.然后我开始尝试该功能,发现无论我改变它,碰撞都不会低于35%.现在我正在使用
unsigned int stringToHash(char *word, unsigned int hashTableSize){
unsigned int counter, hashAddress =0;
for (counter =0; word[counter]!='\0'; counter++){
hashAddress = hashAddress*word[counter] + word[counter] + counter;
}
return (hashAddress%hashTableSize);
}
Run Code Online (Sandbox Code Playgroud)
这只是我提出的随机功能,但它给了我最好的结果 - 大约35%的碰撞.
过去几个小时我一直在阅读有关散列函数的文章,我尝试使用一些简单的函数,比如djb2,但是所有这些都给了我更糟糕的结果.(djb2导致了37%的碰撞,这是'更糟糕的是,但我期待更好而不是更糟糕的事情)我也不知道如何使用其他更复杂的一些,例如murmur2,因为我不知道参数是什么(关键,len ,种子)他们接受了.
即使使用djb2,或者我做错了什么,获得超过35%的碰撞是正常的吗?什么是关键,len和种子价值?
假设你有这两个字符串序列
abc cba bc
bc abc cba
我正在尝试为这些序列创建映射(序列也是一个字符串),以便将上述两个序列映射到同一个桶中.
我最初的想法是添加分别应用于每个字符串的散列函数的结果.这样他们的顺序无关紧要.如果我将散列函数作为一个整体应用于序列字符串,那么散列结果当然会有所不同.
但是我对字符串散列函数的世界很新,我不知道这种方法是否有效.
在这个网站http://www.partow.net/programming/hashfunctions/index.html
我发现了很多不同的字符串散列实现,但是我不确定哪一个对我的需求来说是"最好的".
关于序列中每个字符串的一些技术细节是每个字符串不会超过25个字符.此外,每个序列不会超过3个字符串.
问题
1. 这种方法是将字符串散列函数的结果添加到序列的每个字符串中吗?
2. 如果是,我应该使用哪个字符串散列函数,这会产生少量的冲突并且也是时间有效的?
先感谢您
我使用djb2算法为字符串生成哈希键,如下所示
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
Run Code Online (Sandbox Code Playgroud)
现在每个循环都有两个大数字的乘法,经过一段时间后,字符串的第5个字符的第4个字符随着哈希值变大而出现溢出
重构的正确方法是什么,以便哈希值不会溢出并且哈希也正确发生
我在我的数据库中有一组密码,我之前使用sha512进行了哈希,现在我已将服务器升级到PHP 5.5,我想使用bcrypt密码哈希.所以我的想法是让用户登录,然后调用此处描述的password_needs_rehash函数来检查密码,然后更新数据库中的密码哈希:
http://php.net/manual/en/function.password-needs-rehash.php
我不知道如何使用这个函数,这里没有列出的例子,它并没有真正说明选项数组的用途.我只需要像这样调用password_needs_rehash函数:
if (password_needs_rehash ($current_hash, PASSWORD_BCRYPT)) {
// update the password using password_hash
}
Run Code Online (Sandbox Code Playgroud) 我有一个与Web服务器通信的iPhone应用程序.启动App时,用户必须使用用户名和密码进行身份验证.应用程序和Web服务器之间的通信是安全的(HTTPS)但我不想向Web服务器发送清除密码,我只想发送密码的"签名"(签名将存储在Web服务器上的数据库).
在IOS上创建这个"签名"的最佳解决方案是什么?我应该使用MD5还是别的什么?
我是否需要使用外部库来构建此签名,还是可以使用IOS SDK中的SecKeyEncrypt来完成?
从长远来看,我将在Android上运行一个应用程序,我必须能够为IOS和Android生成相同的签名.
谢谢你的帮助,
塞巴斯蒂安.
我正在寻找一些具有固定键(在初始化期间固定)并且查找速度更快的地图.它可能不支持以后添加/更新元素.是否有一些算法可以查看键列表并制定一个函数,以便以后查找更快.在我的例子中,键是字符串.
更新:
密钥在编译时是未知的.但在应用程序的初始化时间.以后不会再进行任何插入,但会有很多查找.所以我想要优化查找.
在java中,当我使用String作为Hashmap的键时,我得到的结果与我在HashMap中使用字符串hashcode作为键时的结果略有不同.
任何见解?
如何验证作为哈希值存储在数据库中的密码
当我使用数据库值验证密码哈希时,它永远不会相同,因为它会生成随机盐。
如何添加盐以进行验证和测试。
下面是我用于散列和验证散列密码的代码。
我的代码:
/// <summary>
/// Generate the value from bytes.
/// </summary>
/// <param name="password"></param>
/// <param name="iterationCount"></param>
/// <returns></returns>
private static string GenerateHashValue(string password)
{
return Convert.ToBase64String(GenerateHashBytes(password));
}
/// <summary>
/// Hashing the password using PBKDF2
/// </summary>
/// <param name="password"></param>
/// <param name="iterationCount"></param>
/// <returns></returns>
private static byte[] GenerateHashBytes(string password)
{
byte[] hashValue;
//create salt
byte[] salt = GenerateRandomSalt();
var valueToHash = string.IsNullOrEmpty(password) ? string.Empty : password;
using (var pbkdf2 = new Rfc2898DeriveBytes(valueToHash,salt, iterationCount))
{ …Run Code Online (Sandbox Code Playgroud) 只是想知道除此之外是否还有其他方法。
var hashStringArray = function(array) {
array.sort();
return array.join('|');
};
Run Code Online (Sandbox Code Playgroud)
我不太喜欢排序,并且如果该分隔符包含在字符串之一中,那么使用该分隔符也不安全。总的来说,无论字符串的顺序如何,我都需要生成相同的哈希值。它将是相当短的数组(最多 10 个项目),但会经常需要它,所以它不应该太慢。
我打算将它与 ES6 Map 对象一起使用,并且我需要轻松找到相同的数组集合。
var theMap = new Map();
var lookup = function(arr) {
var item = null;
var hashed = hashStringArray(arr);
if (item = theMap.get( hashed )) {
return item;
}
theMap.set( hashed, itemBasedOnInput );
return itemBasedOnInput;
}
var arr1 = ['alpha','beta','gama'];
var arr2 = ['beta','alpha','gama'];
lookup(arr1) === lookup(arr2)
Run Code Online (Sandbox Code Playgroud)
我需要将消息散列为30个字符串.这种用法的最佳和最安全的哈希函数是什么?
我正在尝试String通过添加一个新字符来测试哈希码的工作方式,然后进行相反的操作以将其减去,但是当我进行计算时,它没有给我正确的答案。
例如
int PRIME = 31;
//this will print 1687846330
System.out.println("mlkjihgfedcb".hashCode());
//this will print 783628775 which equals to "mlkjihgfedcba".hashCode();
System.out.println(("mlkjihgfedcb".hashCode() * PRIME + (int) 'a'));
//this will print 25278344 which doesn't equals to "mlkjihgfedcb".hashCode()
System.out.println(("mlkjihgfedcba".hashCode() - (int) 'a') / PRIME);
Run Code Online (Sandbox Code Playgroud)
我想知道我在上面的最后一步中做的数学正确吗?溢出对计算不重要吗?
我正在为rails 4应用程序进行远程身份验证.密码哈希是使用冷融合哈希库编写的,我需要尝试匹配Rails中的最终结果以允许用户进入应用程序.
我确实看到Digest库有一些用于将字符串转换为SHA512十六进制的东西.但这似乎不是我需要的.哈希的示例片段如下:ü\rÀÚ힎
Ruby中是否有哈希库允许我在SHA512中散列字符串.这样的事情是否存在或是否存在我可以利用的外部宝石?
提前致谢.
问题是找出给定DNA序列中出现不止一次的所有长度为k的序列.我找到了一种使用滚动散列函数的方法,其中对于每个长度为k的序列,计算散列并将其存储在映射中.要检查当前序列是否是重复,我们计算它的散列并检查哈希映射中是否已存在散列.如果是,那么我们在结果中包含此序列,否则将其添加到哈希映射中.
滚动哈希在这里表示,由一个滑动窗口移动到下一个序列的时候,我们使用之前序列的散列,我们删除以前的序列的第一个字符的贡献,并添加新添加的焦炭的贡献方式即新序列的最后一个字符.
Input: AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT
and k=10
Answer: {AAAAACCCCC, CCCCCAAAAA}
Run Code Online (Sandbox Code Playgroud)
这个算法看起来很完美,但我不能去做一个完美的哈希函数,以避免碰撞.如果有人能够在任何情况下解释如何制作完美的哈希值,那将是一个很大的帮助,最重要的是在这种情况下.