C中字符串的哈希函数

时间:2012-06-24 14:34:29

标签: java c

我想在C中实现散列技术,其中字符串的所有排列具有相同的散列键。
例如abc& cab两者都应该有相同的密钥。

我想过添加ascii值&然后检查frequency of characters [重要,否则abc& aad将拥有我们不想要的相同密钥 但是,它看起来效率不高。

是否有更好的散列功能可以很好地解决碰撞问题。也不会导致稀疏哈希表?

Java [for strings]在内部使用哪种散列技术,不仅可以最大限度地减少冲突,而且[insertion ,deletion, search]的操作也足够快?

4 个答案:

答案 0 :(得分:12)

为什么不在散列之前对字符串的字符进行排序?

答案 1 :(得分:4)

显而易见的技巧是简单地对字符串进行排序。您可以简单地使用排序的字符串作为查找键,或者您可以使用任何认为合适的算法对其进行哈希处理。或者您可以使用字符串的行程编码(RLE)表示(因此banana的RLE将为a3bn2),并可选择哈希表示。

很大程度上取决于你要对哈希做什么,以及它们对碰撞的抵抗力。简单的CRC(循环冗余校验和)可能就足够了,或者可能是加密校验和(如MD5或SHA1)对您来说不够安全。

答案 2 :(得分:2)

  

Java [用于字符串]内部使用哪种散列技术   不仅可以最大限度地减少碰撞,还可以减少操作[插入   ,删除,搜索]足够快?

Java中用于速度的基本“技巧”是 缓存哈希值 ,使其成为String的成员变量,因此您只需计算它一次。但这只能在Java中工作,因为字符串是不可变的

答案 3 :(得分:1)

关于散列的主要规则是“不要发明自己的散列算法。永远。”。您可以只对字符串中的字符进行排序并应用标准哈希策略。

如果您对散列感兴趣,请阅读that