Tag: 哈希

Java中的哈希 – 结构和访问时间

我正在寻找关于两个不同但相关的论点的validation – 上面的(A)和下面的(B)第一行 – 在Q中的注释。 (A) HashMap的结构方式是: HashMap是一个普通表。 这就是直接内存访问(DMA)。 HashMap (或一般哈希)背后的整个想法是使用这个恒定时间内存访问 a。)通过自己的数据内容()访问记录,而不是通过它们在DMA中的位置(表索引) b。)管理可变数量的记录 – 许多不具有给定大小的记录,并且在整个使用该结构时可以/不保持大小不变​​。 因此,Java Hash中的整体结构是: 表: 表 //我正在使用HashMap中使用的标识符 该表的每个单元格都是一个桶 。 每个存储桶都是Entry类型的链接列表 – 即,此链接列表的每个节点(不是Java / API的链接列表,但数据结构)属于Entry类型,而Entry类型又是对。 当新对添加到散列中时,将为此对计算唯一的hashCode 。 这个hashCode是表中 索引的关键 – 它告诉这个哪个桶将进入哈希。 注意: hashCode通过函数hash() (在HashMap中为一个)进行“规范化”,以更好地拟合表的当前长度。 indexFor()也用于确定哪个桶,即表的单元格将进入。 确定存储桶后,将添加到此存储桶中链接列表的开头 – 因此,它是此存储桶中的第一个条目以及链接的第一个条目-list-已经存在的现在是这个新添加的“下一个”条目。 // ================================================ =============== (B)从我在HashMap中看到的,调整表的大小 – 哈希仅在基于散列大小和容量(即当前和最大)的决策时完成。 整个哈希中的#个条目。 没有对单个存储桶大小进行重新构造或resize – 例如当存储桶中的最大条目数超过此类时,“resize()”。 这可能是不可能的,但是有可能在桶中大量填充大量条目,而散列的其余部分几乎是空的。 如果是这种情况,即每个桶的大小没有上限,则散列不是常数而是线性访问 – 理论上是一件事。 获取哈希条目需要$ […]

Java相当于Perl的哈希值

由于超级灵活和方便,我一直在使用很多Perl哈希。 例如,在Perl中我可以执行以下操作: $hash{AREA_CODE}->{PHONE}->{STREET_ADDR} 我想知道如何用Java完成同样的事情,我想它与HashMap有关? 谢谢,

你能用PHP获得相同的Java SHA-1吗?

我发现自己需要将网站平台从Java更改为PHP,但我想保留所有用户的密码…… 在将散列值作为网站密码写入之前,我有这段代码做密码散列: MessageDigest md = null; md = MessageDigest.getInstance(“SHA”); md.update(plaintext.getBytes(“UTF-8”)); byte raw[] = md.digest(); hash = new Base64().encodeToString(raw).replaceAll(“\n”, “”).replaceAll(“\r”, “”); 我认为Java代码对密码进行了SHA-1散列,但在此之前,它是字节编码为UTF-8,之后是Base64编码。 我想让一个PHP代码做同样的事情,即为与Java相同的密码返回相同的哈希值,只是看起来我做的SHA-1哈希的PHP代码不会返回相同的SHA (-1,而不是Base64编码,我认为?)与哈希的Java Base64解码值相比时的值……这可能与我在PHP中的密码首先不是UTF-8字节编码这一事实有关(我怎么能用PHP做到这一点? PS 另一个奇怪的事情……我在Java中的密码长度都是28个字符(通常类似于这个rnwn4zTNgH30l4pP8V05lRVGmF4= )……但这些密码哈希值的Base64().decode(hash)值是10个字符长(例如[B@14e1f2b )。 我认为Base64为每3个章程做了额外的1个字符(28或27,不包括padding = charter,比那些10个字符大三分之一)所以我在做某些解码调用错误可能??? 最重要的是,PHP中的SHA-1密码散列值是40个字符长(在UTF-8 mysql数据库中),如dd94709528bb1c83d08f3088d4043f4742891f4f ?

如何生成String的长哈希?

我有一个java applciation,我想在其中生成字符串的long id(为了在neo4j中存储这些字符串)。 为了避免数据重复,我想为存储在一个long整数中的每个字符串生成一个id,对于每个字符串应该是唯一的。 我怎样才能做到这一点 ?

如何在Java中解密sha1加密的String

是否有可能解密之前使用Java中的SHA-1算法加密的字符串?

轻量级校验和算法的不错选择?

为了保持一致性,我发现自己需要为一串数据生成校验和。 广义的想法是客户端可以根据收到的有效负载重新生成校验和,从而检测传输过程中发生的任何损坏。 我隐约意识到这种事情背后有各种各样的数学原理,如果你试图自己滚动它,那么微妙的错误就很容易使整个算法失效。 所以我正在寻找有关散列/校验和算法的建议,其标准如下: 它将由Javascript生成,因此需要相对较轻的计算。 validation将由Java完成(虽然我看不出这实际上是一个问题)。 它将采用中等长度的文本输入(URL编码的Unicode,我相信是ASCII); 通常约200-300个字符,在所有情况下都低于2000。 输出也应该是ASCII文本,越短越好。 我主要对轻量级的东西感兴趣,而不是让碰撞的绝对最小潜力成为可能。 我是否天真地想象一个八字符哈希适合这个? 我还应该澄清,如果在validation阶段没有发现腐败(并且我确实认为这不会100%可靠),那么它不是世界末日,尽管我的其余代码对每个代码的效率都显着降低滑倒的腐败入境。 编辑 – 感谢所有贡献。 我使用了Adler32选项并且认为它在Java中原生支持,在Javascript中非常容易实现,在两端快速计算并且具有8字节输出,这完全符合我的要求。 (请注意,我意识到网络传输不太可能对任何损坏错误负责,并且不会在此问题上折叠我的arm;但是添加校验和validation会消除一个故障点,这意味着我们可以专注于其他领域如果再次发生这种情况。)

在创建帐户时,如何在内存中安全地存储密码?

我们的基于Web的应用程序使用帐户创建期间指定的密码将用户帐户绑定到用户。 在Java的情况下,在将哈希值保存在数据库中之前,如何安全地处理密码。 更具体地说,如何确保持有密码的字符串在足够短的时间间隔内被垃圾收集?

Java:有效地计算大文件的SHA-256哈希值

我需要计算一个大文件(或其中一部分)的SHA-256哈希值。 我的实现工作正常,但它比C ++的CryptoPP计算慢得多(25分钟与10分钟~30GB文件)。 我需要的是C ++和Java中类似的执行时间,因此哈希几乎可以在同一时间准备就绪。 我也尝试过Bouncy Castle实现,但它给了我相同的结果。 这是我如何计算哈希: int buff = 16384; try { RandomAccessFile file = new RandomAccessFile(“T:\\someLargeFile.m2v”, “r”); long startTime = System.nanoTime(); MessageDigest hashSum = MessageDigest.getInstance(“SHA-256”); byte[] buffer = new byte[buff]; byte[] partialHash = null; long read = 0; // calculate the hash of the hole file for the test long offset = […]

hashCode()用于在HashMap中使用的对象数组

我有以下两个类,并希望在HashMap使用Foo1作为键。 如果它们的Foo2对象相等,则两个Foo1对象相等,如果它们的字节数组满足Arrays.equals() ,则Foo2对象相等。 我不太清楚如何为Foo1做hashCode()方法。 我只需要总结每个Foo2对象的哈希Foo2还是效率低下? public class Foo1 { Foo2[] foo2_array; @Override public boolean equals(Object Other) { for (int i = 0; i < foo2_array.length; i++) { if (!foo2_array[i].equals(other.foo2_array[i]) return false; } return true; } @Override public int hashCode() { // what to here? } } public class Foo2 { byte[] values; @Override public boolean […]

什么是64位JVM上对象的默认哈希值

由于对象的默认哈希值是对象的对象地址,因此在32位机器上,考虑到哈希值是一个int值,这是有道理的。 我的问题是在64位机器上,地址应该是64位对吗? 那么32位int哈希值怎么样? 是否会有一些下转换(从64位到32位)?