Java 数据的最小表示?

Java 数据的最小表示?,java,Java,如果这个问题真的很奇怪,我很抱歉。我正在将数据发送到一个队列,我不希望将重复数据发送到该队列。该程序无法防止重复数据项,只能接受它们,但我相信队列ID必须是唯一的,我可以自己指定它们。所以我想尝试根据我发送的数据生成我的ID 假设我有两个字符串: hello, SO how are you? //base case hello, SO how are you? //same hello, SO how are You? //different, notice the capital Y What

如果这个问题真的很奇怪,我很抱歉。我正在将数据发送到一个队列,我不希望将重复数据发送到该队列。该程序无法防止重复数据项,只能接受它们,但我相信队列ID必须是唯一的,我可以自己指定它们。所以我想尝试根据我发送的数据生成我的ID

假设我有两个字符串:

hello, SO how are you? //base case
hello, SO how are you? //same
hello, SO how are You? //different, notice the capital Y
What up, SO! //completely different
在Java中,我可以将其转换为什么,以匹配上面的前两个字符串,但使其他两个字符串唯一?到目前为止,我还没有尝试太多(因为我不确定到底什么是最好的转换方式),但我确实使用了一些
GZIPOutputStream
,但大小似乎有点相似,我不确定它是否是最有效的(即最小的大小,比如一些疯狂的十六进制字符或其他)

我希望有人能理解我的要求,但如果没有,请让我知道,我会尽力澄清

编辑:对不起,我不仅仅想要字符串,我还需要处理列表(可能还有字典)。对不起

谢谢

代码:


使用
字符串
本身作为队列ID,或者如果需要
整数
使用(
hashCode()
为相同的字符返回相同的值)

编辑: 如果对象实际上不是字符串,最好的方法是实现自己的
hashCode()
方法。或者,对于“快速且不干净”的字符串,您可以简单地将其呈现为一个字符串(用唯一位组成一个唯一的字符串),并在该字符串上调用字符串的hashCode()

编辑(更多): 问题是您使用的是数组的
.toString()
,在java中,它不是为数组类实现的,因此它会返回到对象的实现,对象的实现对于每个数组都是唯一的,即使内容相同

幸运的是,JDK提供了答案:使用实用方法


使用
字符串
本身作为队列ID,或者如果需要
整数
使用(
hashCode()
为相同的字符返回相同的值)

编辑: 如果对象实际上不是字符串,最好的方法是实现自己的
hashCode()
方法。或者,对于“快速且不干净”的字符串,您可以简单地将其呈现为一个字符串(用唯一位组成一个唯一的字符串),并在该字符串上调用字符串的hashCode()

编辑(更多): 问题是您使用的是数组的
.toString()
,在java中,它不是为数组类实现的,因此它会返回到对象的实现,对象的实现对于每个数组都是唯一的,即使内容相同

幸运的是,JDK提供了答案:使用实用方法


如果您需要的东西不仅适用于
字符串
,还可以选择算法

在java中,您可以这样使用

MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
byte[] buf = crypt.digest("hello, SO how are you?".getBytes());
它与字节数组一起工作,因此您可以转换字节[]中的类型,然后使用它

结果是长度为20的
字节[]
。因此,如果原始数据长度大于20字节,则这是一个不错的选择


关于两个不同的输入产生相同结果的概率,请阅读本文。或者在网上搜索更多的技术资料。在任何情况下,概率都非常低。

如果您需要的东西不仅适用于
字符串,还可以选择算法

在java中,您可以这样使用

MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
byte[] buf = crypt.digest("hello, SO how are you?".getBytes());
它与字节数组一起工作,因此您可以转换字节[]中的类型,然后使用它

结果是长度为20的
字节[]
。因此,如果原始数据长度大于20字节,则这是一个不错的选择


关于两个不同的输入产生相同结果的概率,请阅读本文。或者在网上搜索更多的技术资料。无论如何,可能性非常低。

啊,这就是我的意思。以前没有注意到字符串方法。非常感谢,这很好。对不起,我不是很清楚。我用字符串作为例子,但想找一个通用的解决方案。对于字符串,它似乎可以工作,但当我使用列表进行测试时,我似乎在同一个列表中得到不同的int值。有什么东西可以用于不同类型的数据吗?进一步看,我认为这与列表有关,即使我将它们转换为字符串,它们看起来也不一样(我想我可以将其转换为字符串,然后再转换为哈希代码),但列表是相同的,我复制/粘贴了它。谢谢,转换为字符串,然后再转换为哈希代码不起作用。我将在答案中发布我的代码,向您展示我在做什么。哇,这很有效(使用Arrays.toString(is.hashCode())。我相信你经常听到这个,但你是个天才!我想知道,对于不同的数据,数字是否有可能是相同的,或者这是完全不可能的?啊,这就是我的意思。以前没有注意到字符串方法。非常感谢,这很好。对不起,我不是很清楚。我用字符串作为例子,但想找一个通用的解决方案。对于字符串,它似乎可以工作,但当我使用列表进行测试时,我似乎在同一个列表中得到不同的int值。有什么东西可以用于不同类型的数据吗?进一步看,我认为这与列表有关,即使我将它们转换为字符串,它们看起来也不一样(我想我可以将其转换为字符串,然后再转换为哈希代码),但列表是相同的,我复制/粘贴了它。谢谢,转换为字符串,然后再转换为哈希代码不起作用。我将在答案中发布我的代码,向您展示我在做什么。哇,这很有效(使用Arrays.toString(is.hashCode())。我相信你经常听到这个,但你是个天才!我想知道,对于不同的数据,数字是否有可能相同,或者这完全不可能?谢谢Dash1e,我将使用它并进行测试。谢谢Dash1e,我将使用它并进行测试。
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
byte[] buf = crypt.digest("hello, SO how are you?".getBytes());