Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Kotlin将长字符串字母转换为数字id_Algorithm_Kotlin - Fatal编程技术网

Algorithm Kotlin将长字符串字母转换为数字id

Algorithm Kotlin将长字符串字母转换为数字id,algorithm,kotlin,Algorithm,Kotlin,我试图找到一种方法,将长字符串ID(如T2hR8VAR4tNULoglmIbpAbyvdRi1y02rBX)转换为数字ID 我曾考虑过获取每个数字的ASCII值,然后将它们相加,但我不认为这是一种好方法,因为不同的数字可以得到相同的结果,例如,ABC和BAC将得到相同的结果 A=10,B=20,C=50 ABC=10+20+50=80 BAC=20+10+50=80 我还考虑过获取每个字母的ASCII码,然后设置彼此相邻的数字,例如ABC 所以ABC=102050 这个方法不起作用,因为有一个2

我试图找到一种方法,将长字符串ID(如T2hR8VAR4tNULoglmIbpAbyvdRi1y02rBX)转换为数字ID

我曾考虑过获取每个数字的ASCII值,然后将它们相加,但我不认为这是一种好方法,因为不同的数字可以得到相同的结果,例如,ABC和BAC将得到相同的结果

A=10,B=20,C=50

ABC=10+20+50=80

BAC=20+10+50=80

我还考虑过获取每个字母的ASCII码,然后设置彼此相邻的数字,例如ABC

所以ABC=102050


这个方法不起作用,因为有一个20个字母的字符串将导致一个巨大的数字,所以我如何解决这个问题?先谢谢你

如果您需要100%确信不存在可能的重复项,并且输入字符串的长度可以达到20个字符,那么您不能将ID存储为64位长。您必须使用BigInteger:

val id = BigInteger(stringId.toByteArray())
在这一点上,我质疑将ID转换为数字格式是否有意义。字符串本身可以是ID。

您可以使用hashCode函数。id.hashcode。所有对象都实现此函数的方差

从:

openfunhashcode:Int

返回对象的哈希代码值。hashCode的总合同为:

只要在同一对象上多次调用hashCode方法,hashCode方法必须始终返回相同的整数,前提是不修改在对象上的equals比较中使用的信息

如果根据equals方法两个对象相等,那么对两个对象中的每个对象调用hashCode方法必须产生相同的整数结果

默认情况下,所有平台对象都实现它。如果您有很多ID,那么总是有可能重复

如果使用基于JVM的kotlin环境,则哈希将由
从JVM中。

是否有办法缩短大整数并使其适合整数如果我能找到转换字符串ID生成的数字的最大长度,然后将其除以给定的数字可以得到唯一整数,例如,102050和201050除以200将得到510和1005,这要短得多,但这会降低我的准确性。。。但我不认为它会起作用,因为大整数太大了……任何包含两个以上UTF-16代码单元的字符串都不能放入32位整数中。除以一个数字没有帮助,因为当你进行整数运算时,余数会被抛出。您将没有唯一的ID。由于不能将任何包含两个以上字母的字符串存储为Int,但您需要的是长字符串,因此我认为为可能值的极小部分创建一个特例使其复杂化是没有意义的。除非ID的创建非常受控制,所以您非常喜欢32位范围内的ID。我认为,要使适合Int的ID的空间最小化,最好的方法是使用一个包含Int属性的包装器类?还有一个大整数?这些ID是由服务器自动生成的,我无法对它们进行操作,这些ID需要转换为int,这样当该ID发送通知时,我可以将它们堆叠在一起,而不会将它们显示为单独的通知。通知管理器仅在int中获取ID。如果有这些约束,我想您必须冒一些冲突和不正确合并通知的风险。如果你收到的ID有某种模式,比如它们大多是小整数或特定长度,您可以尝试找到一个哈希函数,该函数不太可能为更常见的ID创建冲突。不需要太多的ID就有很高的冲突可能性。从我在这里读到的内容来看,存在冲突的可能性,但可能性是1/2^32。对于我的情况,我认为这是一个很好的百分比,正如我提到的,我需要这个id用于通知系统,我不认为在这种情况下碰撞的可能性会很高。你怎么认为?或者我遗漏了什么?当你使用散列时,总是有发生冲突的机会。你不能百分之百肯定。。它不是1/2^32,你可以看一下,这可以解释一下。我不知道你的应用程序的行为,但用户可能不会同时收到100k通知。