英文短语的哈希算法



我现在正在制作一个英语单词应用程序,我希望每个单词都有一个不同的int id,因为所有单词都彼此不同,我认为它们可以简单地分配一个整数(或长?)

我不想按照字母顺序给它们连续的id。我想可能有一个现有的算法来满足这个要求,我不想发明自己的轮子,所以,请帮助我。

我更喜欢整数id,因为我希望结构紧凑,足够小,可以在互联网上传输,因为一个单词列表可能包含成百上千个单词。

假设我有如下的数据结构:

struct word {
  int wordId;
  byte familiarity;
}
// I prefer the mapping like this
apple -> 0x1,  0x4
app   -> 0x2E, 0x2
ape   -> 0xEA, 0x1
更新:

好的,我要做的是为用户提供几个单词列表,每个单词列表都包含几个单词,很可能用户已经学习了一些单词(例如:苹果),所以他/她想跳过这些词,并希望他们永远不会再出现。所以,我想让用户跳过这些单词,选择的单词将被发送到服务器或保存在本地文件中,可能没有必要发送整个单词或短语。我在这里发现了一个问题:http://stackoverflow.com/questions/7700400/whats-a-good-hash-function-for-english-words,你有更好的解决方案吗?

是的,似乎不可能找到一个完美的无冲突哈希算法,我可能最终要维护一个映射文件

我还发现了一个很棒的问题和答案这里。

实际上我不介意这个算法的性能,因为它都是在服务器上完成的,而且只在启动时完成一次。我想要的只是每个单词/短语的id是唯一的,尽可能短,就像指纹一样。我想知道我是否能利用质数。

最后,我决定使用一个长字符作为id

(8位)第一个单词的第一个字母
(8位)最后一个单词的最后一个字母
(4位)字数
(4位)短语
中最长单词的序列号(8位)字符计数,包含空格
(32bit) MurmurHash3 result

您可以在这里找到murmurhash3cs实现:
https://gist.github.com/automatonic/3725443
我认为这种方法将为任何现有的单词和短语生成唯一的id,没有冲突。

最新更新