String 将单词转换为唯一标识符
我的目标是将单词转换为唯一标识符(数字) “WORD”=>X(例如) 但是要应用的数学(或其他方法)公式必须是决定论的、传递的,并且字符顺序很重要 例如,让我们将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”)=>
transform
定义为数学函数的名称,如:
变换(“字”)=>X
规则/目标:
transform
(“WORD”)=>X,则transform
公式必须始终返回X。因此,例如transform
公式不能是“变量的内存地址”transform
(“WORD”)=>X
然后transform
(“单词”)=>Y其中Y>Xtranform
(“WORD”)必须与tranform
(“ROWD”)不同转换
(“行”)=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]