我的目标是将单词转换为唯一标识符(数字)。
“WORD”=> X(例如)
但要应用的数学(或其他方法)公式必须是确定性,传递性,字符顺序重要
例如,让我们将transform
定义为数学函数的名称,如:
tranform(“WORD”)=> X
规则/目标:
必须是确定性的:
如果transform
(“WORD”)=> X然后transform
公式必须始终返回X.因此transform
公式不能是“变量的内存地址”。
Transitive(可选,出于性能目的,这将是一件好事)
如果tranform
(“WORD”)=> X
那么tranform
(“WORDS”)=> Y,其中Y> X.
订单很重要
tranform
(“WORD”)必须与tranform
(“ROWD”)不同
任何想法/方法?
我已经尝试了以下方法,但这不正确:
Ascii字符代码
transform
(“WORD”)= 87 + 79 + 82 + 68 = 316
transform
(“ROWD”)= 82 + 79 + 87 + 68 = 316
因此规则3失败
答案 0 :(得分:4)
假设使用ASCII,您可以简单地将每个字符解释为[0,128]上的数字。
然后你的话只是基数为128的数字。
您的传递要求未明确规定,但此方法至少在字长方面具有传递性。
答案 1 :(得分:1)
听起来你正在尝试生成各种哈希码。 Java hashCode()
的String实现非常简单,因此用其他语言实现类似的东西并不困难。
来自Java API Docs的算法:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
s [i]是字符串的第i个字符,n是字符串的长度
答案 2 :(得分:1)
将字符串转换为base-n数字绝对是关键(如另一个答案中所述)。以下是表示transform
函数输出的方法:
我假设您的转换应采用十进制数字序列的形式。另外我假设你的角色在ASCII范围内(总共128种可能性)
关键是为初始字符串中的每个字母分配3位数字。每个三位数位置的值设置为0到127之间的字母(或字符)的索引。
转换函数的工作原理如下:
transform(C1C2C3) = index[C1]index[C2]index[C3]
索引返回三位数序列(即001,020或120),显示给定字符Cx的位置。结果相互连接(不累积)。
样本将是:
转换(" WORD")= 087079082068
显示transform
功能涵盖了您的所有规则现在很容易。