Tag: 哈希

什么是较便宜的哈希算法?

我对哈希算法知之甚少。 我需要在将文件转发到远程系统(有点像S3)之前计算Java中的传入文件的哈希值,这需要MD2 / MD5 / SHA-X中的文件哈希。 出于安全原因,不会计算此哈希,而只是为了一致性校验和。 我可以使用Java标准库的DigestInputStream在转发文件时实时计算此哈希值,但是想知道最好使用哪种算法来避免使用DigestInputStream的性能问题? 我的一位前同事测试并告诉我们,与unix命令行或文件相比,计算hash实时可能非常昂贵。 关于过早优化的编辑:我在一家公司工作,目的是帮助其他公司取消他们的文件。 这意味着我们有一个处理来自其他公司的文件传输的批次。 我们将来每天定位数百万份文档,实际上,此批次的执行时间对我们的业务非常敏感。 每天100万个文档的散列优化10毫秒是每天执行时间缩短3小时,这是非常巨大的。

如何从三个long生成哈希码

我有一个坐标为键的HashMap。 坐标有3个长度,保持x,y和z坐标。 (坐标是并且需要是一个自定义类,坐标需要很长)。 现在我希望能够通过执行以下hashMap.get(new Coordinate(5, 10, 4))来访问例如字段[ hashMap.get(new Coordinate(5, 10, 4)) ]: hashMap.get(new Coordinate(5, 10, 4)) 。 我已经实现了equals方法,但这还不够,因为显然我还需要为hashCode提供一个实现。 所以我的问题是如何从三个长度生成一个独特的hashCode? 。 附加:使用外部库中的哈希生成器不是选项。

hashcode()和equals()方法

所以我对hashcode()和equals()方法有疑问 假设我只是写了一个非常基本的程序来覆盖这两个方法 import java.util.*; class Employee { private String name; private int empid; public Employee(String name,int empid) { this.name=name; this.empid=empid; } public int getEmpid() { return empid; } public String getName() { return name; } public boolean equals(Object obj) { System.out.println(“equals has just been called…”); Employee e1=(Employee)obj; return ((name.equals(e1.name)) && (empid==e1.empid)); } public int hashCode() […]

使用java安全提供程序单独摘要和签名

由于一些实现细节,我需要拆分散列和签名生成。 我尝试使用’NONEwithRSA’签名算法来实现这一点。 这是一个基本的工作示例: public void rsaSignatureIntegrityTest() { KeyPairGenerator gen = KeyPairGenerator.getInstance(“RSA”); gen.initialize(2048, new SecureRandom()); KeyPair pair = gen.generateKeyPair(); byte[] digest = MessageDigest.getInstance(“SHA-256”).digest(MESSAGE); Signature signer = Signature.getInstance(“NONEwithRSA”); signer.initSign(pair.getPrivate()); signer.update(digest); byte[] signed = signer.sign(); Signature verifier = Signature.getInstance(“SHA256withRSA”); verifier.initVerify(pair.getPublic()); verifier.update(MESSAGE); verifier.verify(signed); } 运行此命令, verifier.verify()方法将引发Signatureexception: java.security.SignatureException: Signature encoding error at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204) at java.security.Signature$Delegate.engineVerify(Signature.java:1219) at java.security.Signature.verify(Signature.java:652) at testing.rsaSignatureIntegrityTest(testing.java:38) … […]

为什么Java的语言设计者更倾向于对大多数基于散列的结构的开放寻址进行链接,除了像ThreadLocal这样的结构?

我知道Open Addressing和Chaining之间在解决哈希冲突方面的区别。 大多数基于哈希的基本哈希数据结构如Java中的HashSet , HashMap主要使用链接技术。 我读到ThreadLocal实际上使用了探测方案。 所以我想理解为什么开放式寻址在Java中没有那么多用? 我的意思是,使用该方案删除记录很困难,因为您必须使用一些特殊处理来标记这些单元格。 然而,对于开放寻址方案,似乎存储器要求将是低的。 编辑 :我只是想了解这个设计决定的可能主要原因/原因。 我不想要更精细的细节。 此外,我想知道为什么ThreadLocal使用较少见的开放寻址技术。 我想这两个答案可以联系在一起。 所以我更喜欢在同一个问题中提问。

非空字符串的哈希码是否可以为零?

通过“非空”,我的意思是在这个问题中包含至少一个非零字符的字符串。 作为参考,这是hashCode实现: 1493 public int hashCode() { 1494 int h = hash; 1495 if (h == 0) { 1496 int off = offset; 1497 char val[] = value; 1498 int len = count; 1499 1500 for (int i = 0; i < len; i++) { 1501 h = 31*h + val[off++]; 1502 } 1503 hash […]

Java – 生成随机盐不是随机的

我正在尝试在Java中生成一个salt,以便使用散列算法进行安全密码存储。 我正在使用以下代码创建随机盐: private static String getSalt() throws NoSuchAlgorithmException { SecureRandom sr = SecureRandom.getInstance(“SHA1PRNG”); byte[] salt = new byte[16]; sr.nextBytes(salt); System.out.println(salt.toString()); return salt.toString(); } 这应该生成一个完全安全的,随机生成的盐,用于我的散列算法。 然而,当我运行代码时,它每次都会输出相同的盐…表明生成的盐根本不是随机的。 出于明显的安全目的,每个用户都需要一个独特的盐,但是如果我每次创建一个新帐户时都使用这个代码,那么每个用户将拥有相同的盐,从而无法首先使用它。 我的问题是:为什么这会一直给我相同的盐,我该怎么做才能确保每次运行代码时生成的盐都是完全随机的? 编辑: 以为我会包含整个哈希程序的源代码,现在已经修复并正常工作。 这是一个简单的原型,用于模拟在创建帐户时生成哈希值,然后在登录系统时检查密码。 package hashingwstest; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; import java.util.Scanner; public class HashingWSTest { public static void main(String[] args) throws NoSuchAlgorithmException { Scanner […]

从FSDataInputStream转换为FileInputStream

我是Hadoop HDFS的新手,而且Java非常生疏,我需要一些帮助。 我正在尝试从HDFS读取文件并计算此文件的MD5哈希值。 一般的Hadoop配置如下。 private FSDataInputStream hdfsDIS; private FileInputStream FinputStream; private FileSystem hdfs; private Configuration myConfig; myConfig.addResource(“/HADOOP_HOME/conf/core-site.xml”); myConfig.addResource(“/HADOOP_HOME/conf/hdfs-site.xml”); hdfs = FileSystem.get(new URI(“hdfs://NodeName:54310”), myConfig); hdfsDIS = hdfs.open(hdfsFilePath); 函数hdfs.open(hdfsFilePath)返回FSDataInputStream 问题是我只能从HDFS中获取FSDataInputStream ,但我想从中获取一个FileInputStream 。 下面的代码执行散列部分,并根据我在StackOverflow上找到的东西进行改编(现在似乎无法找到它的链接)。 FileInputStream FinputStream = hdfsDIS; // <—This is where the problem is MessageDigest md; try { md = MessageDigest.getInstance("MD5"); FileChannel channel = FinputStream.getChannel(); ByteBuffer buff […]

如何用Java计算文件的哈希值?

我编写了以下程序来计算Java中字符串的SHA-256哈希值: public class ToHash { public static void main(String[] args) { byte[] data = “test”.getBytes(“UTF8”); MessageDigest digest = MessageDigest.getInstance(“SHA-256”); byte[] hash = digest.digest(data); System.out.println(new BASE64Encoder().encode(hash)); } } 嗯,这很好。 在下一步中,我想以接受文件并计算其哈希值的方式开发它。 我的解决方案是在字符串数组中读取整个文件,并在该字符串数组上调用digest()方法。 但是有两个问题: 我不知道如何将整个文件读入数组? 目前我认为我必须逐行阅读并附加一个带有新行的数组! 以上方法需要大量文件的大量内存! 这是我当前读取文件的程序: public class ToHash { public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, FileNotFoundException, IOException { // TODO code application logic […]

从string和int创建哈希

我记得eclipse和idea有这个模板根据其属性自动创建一个对象的hashCode。 如果使用数字和字符串,其中一种策略是这样的。 return stringValue.hashCode() + intValue * 32; 这样的东西。 我手头没有也没有日食或想法,我想创造这样的function。 编辑 根据答案,我创建了这个迷你课程 class StringInt { private final String s; private final int i; static StringInt valueOf( String string , int value ) { return new StringInt( string, value ); } private StringInt( String string, int value ) { this.s = string; this.i = value; } […]