从String创建唯一的id(int)[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从String创建唯一的id(int)[关闭]相关的知识,希望对你有一定的参考价值。

我有一个具有id(String)的模型列表(DocumentSnapshot from Firestore)。我需要为每个人创建一个通知,它们可能很多(来自聊天的消息),我需要使用int id来分配通知。我需要使用他们的String id,因为我可以收到该模型的更新版本,所以我想更新通知前面的精确模型。什么可以解决方案?

答案

从无限的字符串集中产生唯一的int id是不可能的。但是你可以为你的目的使用一个好的哈希函数 - 在大多数情况下它会足够好。请考虑使用比普通#hashCode实现更好的东西。我建议你看看https://github.com/google/guava/wiki/HashingExplained

并至少使用murmur3算法。代码段如下所示:

import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;

public class Main {

    public static void main(String[] args) {
        System.out.println(
                Hashing.murmur3_32()
                .newHasher()
                .putString("Some Sting", Charsets.UTF_8)
                        .hash().asInt());
    }
}
另一答案

感谢我找到了最佳解决方案:

public static int hashCode(String string) {
    return Hashing.murmur3_32()
            .newHasher()
            .putString(string, Charsets.UTF_8)
            .asInt());
} 

或者,与String.hashCode()感谢Greggz&navy1978:

public static int hashCode(String string) {
    return string != null ? string.hashCode() * PRIME : 0;  // PRIME = 31 or another prime number.
}

或者这是@NonNull

public static int hashCode(@NonNull String string) {
    return string.hashCode() * PRIME;  // PRIME = 31 or another prime number.
}
另一答案

你可以尝试,正如Greggz已经建议的那样,使用hashCode,例如Eclipse,建议这个实现(变量“b”是你的String):

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((b == null) ? 0 : b.hashCode());
    return result;
}

当然,你可以改变/适应你的需求......

另一答案

像这样做

int uniqueNumber = myString.hashCode()

以上是关于从String创建唯一的id(int)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为多行SQL创建唯一ID

为什么数据库ID用int不用string

如何从 10 个长度的数字/字母医疗 ID 创建一个不可逆的唯一 ID?

如何获取firebase生成的唯一ID [关闭]

将数组值从字符串转换为int?

从 int8_t 数组创建 std::string