标签: string-hashing

简单的哈希函数

我正在尝试编写一个使用哈希表来存储不同单词的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和种子价值?

c hashtable function string-hashing

33
推荐指数
1
解决办法
6万
查看次数

C++:关于字符串序列的哈希函数的建议,其中字符串的顺序是无关紧要的

假设你有这两个字符串序列

abc cba bc

bc abc cba

我正在尝试为这些序列创建映射(序列也是一个字符串),以便将上述两个序列映射到同一个桶中.

我最初的想法是添加分别应用于每个字符串的散列函数的结果.这样他们的顺序无关紧要.如果我将散列函数作为一个整体应用于序列字符串,那么散列结果当然会有所不同.

但是我对字符串散列函数的世界很新,我不知道这种方法是否有效.

在这个网站http://www.partow.net/programming/hashfunctions/index.html

我发现了很多不同的字符串散列实现,但是我不确定哪一个对我的需求来说是"最好的".

关于序列中每个字符串的一些技术细节是每个字符串不会超过25个字符.此外,每个序列不会超过3个字符串.

问题

1. 这种方法是将字符串散列函数的结果添加到序列的每个字符串中吗?

2. 如果是,我应该使用哪个字符串散列函数,这会产生少量的冲突并且也是时间有效的?

先感谢您

c++ hash map sequence string-hashing

8
推荐指数
1
解决办法
1532
查看次数

djb2哈希函数

我使用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个字符随着哈希值变大而出现溢出

重构的正确方法是什么,以便哈希值不会溢出并且哈希也正确发生

hash string-hashing

6
推荐指数
2
解决办法
2万
查看次数

如何在PHP 5.5中使用password_needs_rehash函数

我在我的数据库中有一组密码,我之前使用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)

php mysql string-hashing php-password-hash

6
推荐指数
1
解决办法
2547
查看次数

哈希客户端/服务器应用程序的用户密码

我有一个与Web服务器通信的iPhone应用程序.启动App时,用户必须使用用户名和密码进行身份验证.应用程序和Web服务器之间的通信是安全的(HTTPS)但我不想向Web服务器发送清除密码,我只想发送密码的"签名"(签名将存储在Web服务器上的数据库).

在IOS上创建这个"签名"的最佳解决方案是什么?我应该使用MD5还是别的什么?

我是否需要使用外部库来构建此签名,还是可以使用IOS SDK中的SecKeyEncrypt来完成?

从长远来看,我将在Android上运行一个应用程序,我必须能够为IOS和Android生成相同的签名.

谢谢你的帮助,

塞巴斯蒂安.

md5 password-protection string-hashing ios

6
推荐指数
1
解决办法
5678
查看次数

为查找优化的哈希映射

我正在寻找一些具有固定键(在初始化期间固定)并且查找速度更快的地图.它可能不支持以后添加/更新元素.是否有一些算法可以查看键列表并制定一个函数,以便以后查找更快.在我的例子中,键是字符串.

更新:

密钥在编译时是未知的.但在应用程序的初始化时间.以后不会再进行任何插入,但会有很多查找.所以我想要优化查找.

c++ hash string-hashing data-structures

5
推荐指数
1
解决办法
1366
查看次数

在Java中散列密钥

在java中,当我使用String作为Hashmap的键时,我得到的结果与我在HashMap中使用字符串hashcode作为键时的结果略有不同.

任何见解?

java hashtable hashmap string-hashing

5
推荐指数
1
解决办法
1万
查看次数

Rfc2898DeriveBytes 如何验证作为哈希值存储在数据库中的密码

如何验证作为哈希值存储在数据库中的密码

当我使用数据库值验证密码哈希时,它永远不会相同,因为它会生成随机盐。

如何添加盐以进行验证和测试。

下面是我用于散列和验证散列密码的代码。

我的代码:

/// <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)

c# hash password-hash string-hashing

5
推荐指数
1
解决办法
1418
查看次数

JavaScript 中字符串的哈希数组

只是想知道除此之外是否还有其他方法。

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)

性能测试

http://jsperf.com/hashing-array-of-strings/5

javascript arrays lookup string-hashing

4
推荐指数
1
解决办法
3576
查看次数

哈希函数产生30个字符的代码?

我需要将消息散列为30个字符串.这种用法的最佳和最安全的哈希函数是什么?

encryption algorithm hash string-hashing

3
推荐指数
2
解决办法
9249
查看次数

Java哈希码反向计算

我正在尝试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)

我想知道我在上面的最后一步中做的数学正确吗?溢出对计算不重要吗?

java int hashcode string-hashing

2
推荐指数
2
解决办法
7852
查看次数

如何在Rails 4中将字符串转换为SHA512哈希

我正在为rails 4应用程序进行远程身份验证.密码哈希是使用冷融合哈希库编写的,我需要尝试匹配Rails中的最终结果以允许用户进入应用程序.

我确实看到Digest库有一些用于将字符串转换为SHA512十六进制的东西.但这似乎不是我需要的.哈希的示例片段如下:ü\rÀÚ힎

Ruby中是否有哈希库允许我在SHA512中散列字符串.这样的事情是否存在或是否存在我可以利用的外部宝石?

提前致谢.

ruby ruby-on-rails string-hashing

0
推荐指数
1
解决办法
4061
查看次数

重复的DNA序列

问题是找出给定DNA序列中出现不止一次的所有长度为k的序列.我找到了一种使用滚动散列函数的方法,其中对于每个长度为k的序列,计算散列并将其存储在映射中.要检查当前序列是否是重复,我们计算它的散列并检查哈希映射中是否已存在散列.如果是,那么我们在结果中包含此序列,否则将其添加到哈希映射中.

滚动哈希在这里表示,由一个滑动窗口移动到下一个序列的时候,我们使用之前序列的散列,我们删除以前的序列的第一个字符的贡献,并添加新添加的焦炭的贡献方式即新序列的最后一个字符.

Input: AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT
and k=10
Answer: {AAAAACCCCC, CCCCCAAAAA}
Run Code Online (Sandbox Code Playgroud)

这个算法看起来很完美,但我不能去做一个完美的哈希函数,以避免碰撞.如果有人能够在任何情况下解释如何制作完美的哈希值,那将是一个很大的帮助,最重要的是在这种情况下.

algorithm math hash substring string-hashing

-1
推荐指数
1
解决办法
270
查看次数