对于一个演示项目,我想创建一个碰撞概率非常高的散列函数。简单的事情就可以了,因为该项目的目的不是安全 - 而是演示哈希冲突。
任何人都可以帮助我开始使用算法或示例实现,或者只是指出我正确的方向吗?
我在 Python 中执行此操作,尽管这可能无关紧要。
您可以使用字符串中字符的总和。这是我在高中第一次学习 BASIC 时教给我的第一个哈希函数,我马上就遇到了碰撞问题,不得不弄清楚如何处理它。
sum(ord(c) for c in text)
换位很容易通过交换字符串甚至单词来实现。为了更有趣,您还可以使其不区分大小写:
sum(ord(c) for c in text.lower())
我什至会给你最后一个碰撞示例:Jerry Kindall -> Dilan Kyrjer :-)
想到的一种算法是使用字符串的第一个字母进行散列。
就像是
hash[ord(text[0]) - ord('a')] = text
因此,以相同字母开头的任何内容都将被散列在一起。如您所见,这是很多冲突。
另一个想法是根据字符串的长度进行散列。
hash[len(text)] = text
您可以使用 hayden 在上面的评论中建议的内容,并通过将长度取模某个数字来引起进一步的冲突。例如。
hash[len(text) % 5] = text