将单词转换为唯一标识符

时间:2015-11-17 23:02:44

标签: string algorithm math mathematical-optimization symbolic-math

我的目标是将单词转换为唯一标识符(数字)。

“WORD”=> X(例如)

但要应用的数学(或其他方法)公式必须是确定性传递性字符顺序重要

例如,让我们将transform定义为数学函数的名称,如:

tranform(“WORD”)=> X

规则/目标:

  1. 必须是确定性的:

    如果transform(“WORD”)=> X然后transform公式必须始终返回X.因此transform公式不能是“变量的内存地址”。

  2. Transitive(可选,出于性能目的,这将是一件好事)

    如果tranform(“WORD”)=> X 那么tranform(“WORDS”)=> Y,其中Y> X.

  3. 订单很重要

    tranform(“WORD”)必须与tranform(“ROWD”)不同

  4. 任何想法/方法?

    我已经尝试了以下方法,但这不正确:

    1. Ascii字符代码

      transform(“WORD”)= 87 + 79 + 82 + 68 = 316

      transform(“ROWD”)= 82 + 79 + 87 + 68 = 316

      因此规则3失败

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功能涵盖了您的所有规则现在很容易。