我正在研究英语单词应用程序,我希望每个单词都有不同的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,你有更好的解决方案吗?
答案 0 :(得分:0)
是的,似乎找不到完美的无碰撞散列算法,我最终可能会维护一个映射文件。
我也找到了一个很好的问题和答案
here
实际上我不介意这个算法的性能,因为它全部在服务器上完成,并且在启动时只执行一次。我想要的只是每个单词/短语的id都是唯一的,尽可能短,就像指纹一样。我想知道我是否可以利用素数...
最后,我决定使用一个长期的我的身份
(8位)第一个单词的第一个字母
(8位)最后一个字的最后一个字
(4位)字数
(4位)短语
中最长单词的序列号
(8位)字符数,包含空格
(32位)MurmurHash3结果
你可以在这里找到murmurHash3 cs的实现:
https://gist.github.com/automatonic/3725443
我认为这种方法会为任何现有的单词和短语生成唯一的ID,而不会发生冲突。