常用Hash质数表

  61,             83,      113,      151,      211,      281,      379,      509      683,  911        /  一千以下  

    1217,     1627,     2179,     2909,     3881,    6907,          9209,                 /一万以下    

    12281,    16381,    21841,    29123,    38833,    51787,   69061,        92083,          /十万以下

    122777,   163729,   218357,   291143,   388211,   517619,     690163,     999983,    /百万以下

 1226959,  1635947,  2181271,  2908361,  3877817,  5170427, 6893911,      9191891,  /千万以下

12255871, 16341163, 21788233, 29050993, 38734667, 51646229,68861641,  91815541,/一亿以下

1e9+7 和 1e9+9 //十亿左右

122420729,163227661,217636919,290182597,386910137,515880193,687840301,917120411,/十亿以下

1222827239,1610612741, 3221225473ul, 4294967291ul                                                       /十亿以上

Java中常用哈希算法与哈希数据结构紧密相关。在Java里,`HashMap`、`HashSet`等常用哈希数据结构通过哈希函数将键映射到数组中的索引位置,以实现高效查找,而这些数据结构背后有多种哈希算法支持。 在Java中,`Object`类的`hashCode()`方法是基础的哈希算法,它为每个对象生成一个哈希码。这个方法在`HashMap`和`HashSet`等哈希数据结构中被广泛使用,用于确定对象在哈希中的存储位置。 `String`类重写了`Object`的`hashCode()`方法,其哈希算法公式为 `s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]`,其中`s[i]` 是字符串的第`i`个字符,`n` 是字符串的长度,`31` 是一个奇质数。这种算法能有效减少哈希冲突,保证字符串在哈希中的均匀分布。 在`HashMap`中,JDK 1.8及以后版本使用的哈希算法在计算哈希值时,会先调用键对象的`hashCode()`方法得到一个哈希码,然后对这个哈希码进行高位运算和扰动处理,以减少哈希冲突。具体代码如下: ```java static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } ``` 此代码先获取键的哈希码,然后将其高16位与低16位进行异或运算,从而让哈希码的高位信息也能参与到索引计算中,减少哈希冲突的可能性。 另外,Java安全包`java.security`中提供了一些加密哈希算法,如MD5、SHA-1、SHA-256等。这些算法常用于数据完整性校验和安全认证。以下是使用SHA-256算法的示例代码: ```java import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class HashExample { public static String sha256(String input) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedHash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder hexString = new StringBuilder(2 * encodedHash.length); for (byte b : encodedHash) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { String input = "example"; String hash = sha256(input); System.out.println("SHA-256 Hash: " + hash); } } ``` 该代码通过`MessageDigest`类获取SHA-256算法的实例,对输入字符串进行哈希计算,并将结果转换为十六进制字符串输出。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值