【HashCode】字符串哈希码巧合验证

2024-01-26 09:48

本文主要是介绍【HashCode】字符串哈希码巧合验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

已知哈希码是根据对象特性生成,但是还是会存在不同对象计算出相同哈希码的巧合。今天以String为例进行了验证。

代码如下:

import java.util.HashSet;
import java.util.Random;
/**
* Test Clazz
* @author Lix
*/
public class Test{
public static final int SIZE = 7;
public static final int TIME = 100000;
public static void main(String argv[]){
HashSethsi = new HashSet(); 
HashSethss = new HashSet(); 
Random ra = new Random();
StringBuffer sb;
String tempString = "";
for (int i = 0; i < TIME; i++) {
sb = new StringBuffer();
for (int j = 0; j < SIZE; j++) {
sb.append((char)(ra.nextInt(26)+97));
}
tempString = sb.toString();
//System.out.println(tempString);
if(!hsi.add(tempString.hashCode())){
System.out.println("HashCode:"+tempString.hashCode());
System.out.println("String A:"+tempString);
for(Object obj:hss){
if(obj.hashCode() == tempString.hashCode() && !obj.equals(tempString)){
System.out.println("String B:"+obj);
}
}
}
hss.add(tempString);
}
System.out.println(hss.size()+":"+hsi.size()+"\n");
System.out.println("\nExample:");
String a = "mvnjdam";
String b = "wlosaru";
String c = "ypxludk";
String d = "tuwwvkg";
String e = "wmriczg";
String f = "rrqtebc";
System.out.println("a.hash:"+a.hashCode()+"\nb.hash:"+b.hashCode());
System.out.println("c.hash:"+c.hashCode()+"\nd.hash:"+d.hashCode());
System.out.println("e.hash:"+e.hashCode()+"\nf.hash:"+f.hashCode());
}
}
例如在随机字符串长度为7(全部为小写字母)时,生成的十万个字符串有一定几率出现多个字符串不同而Hash码相同的情况。

因此,在某些需要进行String严格比较的场合,需要在哈希码比较验证之后追加equals比较验证。

这篇关于【HashCode】字符串哈希码巧合验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646415

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹