String 将单词转换为唯一标识符

String 将单词转换为唯一标识符,string,algorithm,math,mathematical-optimization,symbolic-math,String,Algorithm,Math,Mathematical Optimization,Symbolic Math,我的目标是将单词转换为唯一标识符(数字) “WORD”=>X(例如) 但是要应用的数学(或其他方法)公式必须是决定论的、传递的,并且字符顺序很重要 例如,让我们将transform定义为数学函数的名称,如: 变换(“字”)=>X 规则/目标: 必须是确定性的: 如果transform(“WORD”)=>X,则transform公式必须始终返回X。因此,例如transform公式不能是“变量的内存地址” 可传递(可选,出于性能目的,这将是一个很好的选择) 如果transform(“WORD”)=>

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

“WORD”=>X(例如)

但是要应用的数学(或其他方法)公式必须是决定论的、传递的,并且字符顺序很重要

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

变换(“字”)=>X

规则/目标:

  • 必须是确定性的:

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

  • 可传递(可选,出于性能目的,这将是一个很好的选择)

    如果
    transform
    (“WORD”)=>X 然后
    transform
    (“单词”)=>Y其中Y>X

  • 秩序很重要

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

  • 有什么想法/方法吗?

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

  • Ascii字符码

    变换(“单词”)=87+79+82+68=316

    转换
    (“行”)=82+79+87+68=316

    所以规则3失败了


  • 假设ASCII,您可以简单地将每个字符解释为[0,128]上的数字

    那么你的单词就是以128为基数的数字


    您的可传递性要求没有明确规定,但这种方法至少在字长上是可传递的。

    听起来好像您在尝试生成各种类型的哈希代码。
    hashcode()
    的Java字符串实现相当简单,因此在另一种语言中实现类似的东西并不困难

    该算法来自:


    s[i]是字符串的第i个字符,n是字符串的长度

    将字符串转换为基数-n数字无疑是关键(如另一个答案中所述)。以下是如何表示
    转换
    函数输出:

    我假设您的转换应该是十进制数字序列的形式。我还假设您的字符在ASCII范围内(总共128个可能)

    关键是为初始字符串中的每个字母指定3位数字。每个三位数字位置的值设置为字母(或字符)的索引,从0到127

    变换函数的工作原理如下:

    transform(C1C2C3) = index[C1]index[C2]index[C3]
    
    其中index返回一个三位序列(即001、020或120),显示给定字符Cx的位置。结果相互连接(不累加)

    一个样本是:

    转换(“字”)=087079082068


    显示
    transform
    函数覆盖所有规则现在很容易。

    用字母数字表示法(A=1、B=2等)汇总每个字母索引的乘积。您的编辑不是我的答案所描述的。Base-128不是简单的数字相加。请阅读Base-n数字的工作原理。如果您的数字有界,则您的第二个要求是不可能的,但字符串的长度没有界。字符串比数字多,因此您必须将一些字符串映射到相同的数字,但它们不能被转换tive.@Rob…是的,我同意暂时性目标可能不可能实现。是的,这是我的第一个方法,但在第3条规则上失败。@Leonel没有。你没有正确地实现我的答案。是的,你是对的,使用一个简单的编码算法解决了我的问题…比如base-128。为什么它总是0?…不应该改为tansform(“WORD”)=“087”+“179”+“282”+“368”=“087179282368”?@Leonel ASCII中的“W”、“O”、“R”和“D”分别为087、079、082、068,这可能比128基变换快,但显然会消耗更多内存。正如@Godsent所说,这种方法使用更多内存,但它的智能实现是使用字符串处理(而不是算术运算)可能有助于获得更好的性能。请注意,使用“0”填充有助于拆分具有固定长度的字符代码。它保证每个字符将转换为三位数字。这是更好的方法…传递性目标可能无法实现。@Leonel“传递性”“在散列中没有真正的意义,但您会发现,对于许多附加字符的字符串,使用此算法实际上会创建更大的值。较长的字符串会有更大的值,因为每个字符上都有加法。
    transform(C1C2C3) = index[C1]index[C2]index[C3]