Java字符串到短哈希代码

Java字符串到短哈希代码,java,hash,Java,Hash,我想使用String对象的java标准hashCode()函数“实现”一个从字符串到短裤的哈希函数。我提出了以下简单的实现: static short shortHashCode(String str) { int strHashCode = str.hashCode(); short shorterHashCode = (short) (strHashCode % Short.MAX_VALUE); return shorterHashCode; } 我的shortHash

我想使用String对象的java标准
hashCode()
函数“实现”一个从字符串到短裤的哈希函数。我提出了以下简单的实现:

static short shortHashCode(String str)
{
   int strHashCode = str.hashCode();
   short shorterHashCode = (short) (strHashCode % Short.MAX_VALUE);
   return shorterHashCode;
}
  • 我的
    shortHashCode
    函数是一个好的哈希函数吗?意思是冲突的可能性很小(两个不同的字符串具有接近1/Short.MAX_值的相同哈希代码的可能性)
  • 有没有更好的方法实现从字符串到短字符串的哈希函数
  • 正在不必要地丢失信息

     (short) (strHashCode % ((Short.MAX_VALUE + 1) << 1));
    
    因为将整数类型转换为较小的整数类型只会截断最重要的位


    它还假设所有比特都具有相同的熵,这可能不是真的。您可以尝试将熵分布到:

     (short) (strHashCode ^ (strHashCode >>> 16))
    
    将高16位与低16位进行异或运算


    意思是冲突的可能性很小(两个不同的字符串具有接近1/Short.MAX_值的相同哈希代码的可能性)

    java.lang.String.hashCode
    不是,因此只有当攻击者无法控制一个或两个输入以强制冲突时,它才具有该属性

    如果将其暴露于来自不受信任源的字符串中,则可能会看到更高的哈希冲突率,这可能允许攻击者拒绝服务

    此外,它的设计目的是权衡碰撞率的小幅度增加,以获得更好的性能和跨版本稳定性。还有更好的字符串散列函数

    正在不必要地丢失信息

     (short) (strHashCode % ((Short.MAX_VALUE + 1) << 1));
    
    因为将整数类型转换为较小的整数类型只会截断最重要的位


    它还假设所有比特都具有相同的熵,这可能不是真的。您可以尝试将熵分布到:

     (short) (strHashCode ^ (strHashCode >>> 16))
    
    将高16位与低16位进行异或运算


    意思是冲突的可能性很小(两个不同的字符串具有接近1/Short.MAX_值的相同哈希代码的可能性)

    java.lang.String.hashCode
    不是,因此只有当攻击者无法控制一个或两个输入以强制冲突时,它才具有该属性

    如果将其暴露于来自不受信任源的字符串中,则可能会看到更高的哈希冲突率,这可能允许攻击者拒绝服务


    此外,它的设计目的是权衡碰撞率的小幅度增加,以获得更好的性能和跨版本稳定性。还有更好的字符串哈希函数。

    是的!散列函数必须为相同的输入返回相同的散列代码。就可能性而言,可能返回32768个不同的短值。机会完全取决于输入集。如果使用随机生成器,则这取决于生成器所基于的统计模型(每个值的概率是否相等,或者某些值的概率是否高于其他值,等等)。让我们假设概率相等。该问题似乎与主题无关,因为它要求对工作代码进行代码审查和发表意见。这是一个离题的话题(太宽泛和基于观点),可能应该在@JarrodRoberson上,我认为问题更多地涉及两种特定语言原语之间的转换,同时保留原语的有用语义属性。对我来说这似乎是个话题。是的!散列函数必须为相同的输入返回相同的散列代码。就可能性而言,可能返回32768个不同的短值。机会完全取决于输入集。如果使用随机生成器,则这取决于生成器所基于的统计模型(每个值的概率是否相等,或者某些值的概率是否高于其他值,等等)。让我们假设概率相等。该问题似乎与主题无关,因为它要求对工作代码进行代码审查和发表意见。这是一个离题的话题(太宽泛和基于观点),可能应该在@JarrodRoberson上,我认为问题更多地涉及两种特定语言原语之间的转换,同时保留原语的有用语义属性。对我来说,这似乎是一个主题。一些示例显示为
    String.hascCode
    生成冲突非常简单:一些示例显示为
    String.hascCode
    生成冲突非常简单: