我想在C
中实现散列技术,其中字符串的所有排列具有相同的散列键。
例如abc
& cab
两者都应该有相同的密钥。
我想过添加ascii
值&然后检查frequency of characters
[重要,否则abc
& aad
将拥有我们不想要的相同密钥
但是,它看起来效率不高。
是否有更好的散列功能可以很好地解决碰撞问题。也不会导致稀疏哈希表?
Java [for strings
]在内部使用哪种散列技术,不仅可以最大限度地减少冲突,而且[insertion ,deletion, search
]的操作也足够快?
答案 0 :(得分:12)
为什么不在散列之前对字符串的字符进行排序?
答案 1 :(得分:4)
显而易见的技巧是简单地对字符串进行排序。您可以简单地使用排序的字符串作为查找键,或者您可以使用任何认为合适的算法对其进行哈希处理。或者您可以使用字符串的行程编码(RLE)表示(因此banana
的RLE将为a3bn2
),并可选择哈希表示。
很大程度上取决于你要对哈希做什么,以及它们对碰撞的抵抗力。简单的CRC(循环冗余校验和)可能就足够了,或者可能是加密校验和(如MD5或SHA1)对您来说不够安全。
答案 2 :(得分:2)
Java [用于字符串]内部使用哪种散列技术 不仅可以最大限度地减少碰撞,还可以减少操作[插入 ,删除,搜索]足够快?
Java中用于速度的基本“技巧”是 缓存哈希值 ,使其成为String
的成员变量,因此您只需计算它一次。但这只能在Java中工作,因为字符串是不可变的。
答案 3 :(得分:1)
关于散列的主要规则是“不要发明自己的散列算法。永远。”。您可以只对字符串中的字符进行排序并应用标准哈希策略。
如果您对散列感兴趣,请阅读that。