Java字符串到短哈希代码
我想使用String对象的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
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
生成冲突非常简单: