最简单的散列是:任意散列(提供足够大的散列空间)!
假设您的字符串是“foo”。它的反面是“oof”。在某些任意顺序(例如字典顺序)中,“foo”出现在“oof”之前。现在散列以该顺序首先出现的字符串。
所以而不是
hash = fancyHash(string);
你做
std::string rstring(string.rbegin(), string.rend());
hash = (string < rstring) ? anyhash(string) : anyhash(rstring);
@HighPerformanceMark 建议的使用 linux 工具的一种方法:(文本是包含您的话的文件。它们可能在同一行,没关系)
rev text | tr "[:upper:]" "[:lower:]" | tr " " "\n" > rtext; rev rtext > rrtext; comm -12 <(sort -u rrtext) <(sort -u rtext);
解释:
rev
反转文件,因此rev text
输出反转
tr "[:upper:]" "[:lower:]"
将所有内容转换为小写(可选。如果“Foo”不计为“oOf”的反转,请不要这样做)
tr " " "\n"
给每个单词一个单独的文件
在此之后,文件rtext
在不同的行上包含小写(可选)单词。该文件中的每个单词都是 file 的倒序单词text
。
rev rtext > rrtext
再次反转以将小写的内容也变为原始内容,并将每个单词分隔在不同的行上。
comm -12 <(sort -u rrtext) <(sort -u rtext)
. 作为 的输入comm
,我们给出了我们首先排序和重复的两个文本文件 ( -u
)。选项抑制所有对第一个输入 ( ) 或第二个输入 ( )-12
唯一的单词。因此,此命令的每个输出都存在于两个文件中。rrtext
rtext