我正在尝试为HashTable编写一个shift折叠方法。 该方法传递一个key(int)值,键值被分成数字组,并添加组。 组中的位数应与arraySize相对应。 EX)输入arraySize = 15; key = 123; 输出:12 + 3 = 15 然而,我写的方法是落后的。 public class C{ public int folding(int key) { int digit =1; // how many digits in arraySize? int arraySize =15; //if 15, 2-digits int hashVal =0; while(arraySize >0 ){ //digit is 100; digit *= 10; arraySize /= 10; } while(key>0){ […]
TL; DR:如何从一个很大的文件中识别重复的非重叠1kb块,也可以是二进制文件? 我最近在其中一个挑战中遇到了这个问题。 我们有一个文件名。 该文件的大小将是1kb的倍数。 我们必须对此文件执行重复数据删除操作,并将修改后的内容写入另一个文件。 重复数据删除操作从文件中查找并删除重复的,不重叠的1kb块。 该文件可以是非常大的文件,也可以是二进制文件。 问题的第二部分涉及反转重复数据删除操作并从重复数据删除的文件重新生成原始文件。 我的方法:我尝试使用Adam Horwath的博客中建议的哈希。 我计算了每个1kb字节数据的散列,并将其存储在散列表中,散列作为键,并将块的索引作为值考虑。 这是我的代码来计算1kb数据的哈希值(类似于博客中的inithash): //implement hashing used in Rabin-Karp algorithm // sum of p^n * a[x] //hconst = 69069; //good multiplier for mod 2^32; public static long calculateHash(int [] data, int chunkSize){ long hash = 1; for(int i =0; i < chunkSize; i++) { int c […]
与大多数Singleton类一样,是否存在使用私有构造函数“扩展”类的标准技术? 具体来说,我正在尝试扩展java.lang.management.ThreadInfo类,因为我将很多它们添加到HashSet来控制唯一性。 但是,我确定两个线程是否相等的方式是不同的,并且与equals()方法的默认实现不同。 在这种情况下,扩展类显然不是一个选项。 制作类似于在构造函数中接受ThreadInfo的包装类,然后使用值手动填充所有相关字段,然后覆盖equals()和hashCode() ,或者有更好的方法来执行此操作是否合理? 像我这样的东西就是我开始写的,但更好的实现是理想的: class ThreadInfoWrapper { private ThreadInfo info; ThreadInfoWrapper(ThreadInfo info) { this.info = info; } //Populate instance variables with Thread.State, thread ID, etc.. with //Getters/setters and all that other stuff public boolean equals(Object o) { //Unique implementation } public int hashCode() { //Whatever implementation } } 但这感觉就像是一种非常迂回的方式来实现一些基本function。 我调查了一下,Java标准库中不存在使用自定义比较器的集合的实现。 我想我可以编写自己的哈希集实现,但这对于一个简单的情况来说太过分了。 任何见解都会有所帮助。
哈希函数在实现哈希表时很重要。 我知道在java Object中有它的哈希码,它可能是从弱哈希函数生成的。 以下是一个“补充哈希函数”的片段 static int hash(Object x) { int h = x.hashCode(); h += ~(h <>> 14); h += (h <>> 10); return h; } 任何人都可以帮助解释哈希算法的基本思想是什么? 生成非重复整数? 如果是这样,这些按位操作如何实现呢?
MessageDigest md = null; try { md = MessageDigest.getInstance(“SHA-1”); } catch(NoSuchAlgorithmException e) { e.printStackTrace(); } String hashToConvert = byteArrayToHexBigInt(md.digest(objectName)); /* * Converts to big Integer, will not be concatted because structure * is large enough to hold the Hash created * Second argument is set to 16 as this is the base for the parsing […]
我要求“检查文件内容的完整性”。 这些文件将写入CD / DVD,可能会多次复制。 这个想法是识别正确复制的副本(在从Nero中删除之后)。 对此更新,但快速搜索表明Arrays.hashCode(byte[])将满足需要。 我们可以在磁盘上包含一个文件,该文件包含每个感兴趣的资源的调用结果,然后将其与检查时从磁盘读取的File的byte[]进行比较。 我是否正确理解了该方法,这是检查文件内容的有效方法吗? 如果没有,将赞赏关于搜索关键字或策略/方法/类的建议。 工作代码基于Brendan的答案。 它处理由VoidStar识别的问题(需要在内存中保存整个byte[]以获取哈希值)。 import java.io.File; import java.io.FileInputStream; import java.util.zip.CRC32; class TestHash { public static void main(String[] args) throws Exception { File f = new File(“TestHash.java”); FileInputStream fis = new FileInputStream(f); CRC32 crcMaker = new CRC32(); byte[] buffer = new byte[65536]; int bytesRead; while((bytesRead = fis.read(buffer)) != -1) […]
我使用HashSet,我需要修改一个对象的ID,但它改变了hashcode并破坏了HashSet和hashCode()方法的规则。 什么是最佳解决方案:从Set中删除对象并使用新ID添加对象,或者在Set中的每个对象中保留哈希码(例如在构造函数中生成),还是有其他方法可以解决此问题? 感谢帮助。 更新:我犯了错误:在对象中保留哈希代码很糟糕,因为在这种情况下,相等的对象可以有不同的哈希代码。
我正在尝试开发一种在彩虹表生成器中使用的缩减function。 缩减函数背后的基本原理是它接受散列,执行一些计算,并返回一定长度的字符串。 目前我正在使用SHA1哈希,我需要返回一个长度为3的字符串。 我需要在任意三个随机字符上组成字符串: abcdefghijklmnopqrstuvwxyz0123456789 我面临的主要问题是我写的任何缩减函数总是返回已经生成的字符串。 一个好的缩减函数只会很少返回重复的字符串。 有人可以提出任何想法来实现这一目标吗? 或者对哈希到字符串操作的任何建议都会很棒。 提前致谢 玩笑
我试图更深入地理解java.util.Collection和java.util.Map,但我对HashSetfunction有一些疑问: 在文档中,它说: 这个类实现了Set接口,由一个哈希表(实际上是一个HashMap实例)支持。 好的,所以我可以看到HashSet总是在后台运行Hashtable。 哈希表是一种结构,每次要向其添加新元素时都会请求键和值。 然后,基于密钥hashCode将值和密钥存储在桶中。 如果两个键的哈希码相同,则使用链表将两个键值添加到同一个桶中。 如果我说错了,请纠正我。 所以,我的问题是:如果一个HashSet总是有Hashtable在后台运行,那么每次我们使用HashSet.add()方法向HashSet添加一个新元素时,HashSet应该将它添加到它的内部Hashtable。 但是,Hashtable要求输入值和密钥 ,那么它使用什么密钥? 它是否仅使用我们尝试添加的值作为键,然后使用其hashCode? 如果我对HashSet实现说错了,请纠正我。 我的另一个问题是:一般来说,哪些类可以使用java对象的hashCode()方法? 我问这个是因为,在文档中,它说我们每次覆盖equals()方法时都需要覆盖hashCode()方法 。 好吧,这真的很有意义,但我怀疑的是,如果只是建议我们应该做的就是保持一切“美好而完美”(以这种方式),或者如果真的有必要,因为可能有很多Java默认类会不断使用对象的hashCode()方法。 在我的视野中,我看不到使用此方法的其他类而不是与集合相关的类。 非常感谢你们
有没有办法指定使用Java API更新Open LDAP目录时用于存储密码的哈希算法(MD5,SHA1等),代码如下: private void resetPassword(String principal, String newPassword) throws NamingException { InitialDirContext ctxAdmin = null; Hashtable ctxData = new Hashtable(); ctxData.put(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.ldap.LdapCtxFactory”); ctxData.put(Context.PROVIDER_URL, “ldap://myserver:389”); ctxData.put(Context.SECURITY_AUTHENTICATION, “simple”); ctxData.put(Context.SECURITY_PRINCIPAL, “admin_dn”); ctxData.put(Context.SECURITY_CREDENTIALS, “admin_passwd”); InitialDirContext ctxAdmin = new InitialDirContext(ctxData); if (newPassword == null || newPassword.equals(“”)) { String msg = “Password can’t be null”; throw new NamingException(msg); } else […]