java - 需要 Java 中的线程安全 MessageDigest

标签 java performance message-digest

我需要在性能关键的环境中使用 MessageDigest 对来自多个线程的多个键进行哈希处理。我开始知道 MessageDigest 不是线程安全的,因为它将状态存储在它的对象中。实现键的线程安全散列的最佳方法是什么?

用例:

MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");

//somewhere later, just need to hash a key, nothing else
messageDigest.update(key);
byte[] bytes = messageDigest.digest(); 

具体来说:

  1. ThreadLocal 能保证工作吗?会不会有表现 惩罚?
  2. getInstance 返回的对象是否不同? 不互相干扰?文档说"new" 对象,但我不确定它是否只是(共享)的包装器 共享具体类?
  3. 如果 getInstance() 返回“真正的”新对象, 每次我需要创建一个新实例是否可取 计算哈希?就性能损失而言——代价是多大 是吗?

我的用例非常简单——只需散列一个简单的键。我负担不起使用同步。

谢谢,

最佳答案

每次需要时创建一个新的MessageDigest实例。

getInstance() 返回的所有实例都是不同的。它们必须是,因为它们维护单独的摘要(如果这对您来说还不够,here's 一个指向源的链接)。

ThreadLocal 可以在与线程池一起使用时提供性能优势,以维护昂贵的构造对象。 MessageDigest 构造起来并不特别昂贵(再次查看源代码)。

关于java - 需要 Java 中的线程安全 MessageDigest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554998/

相关文章:

java - 消息摘要java

java - 使用 SHA-256 散列图像字节会产生许多随机冲突,我做错了什么?

java - Servlet到JSP转发导致jsp页面但不执行java代码(仅html)

java - @Deprecated SerializationFeature.WRITE_EMPTY_JSON_ARRAYS 的替代品

.net - 从 .net 2.0 升级到 4.0 会提高性能吗?

c - 击败或满足 OS X memset(和 memset_pattern4)

java - 何时在消息摘要中使用盐

java - 带有 exec 返回错误 7 的 ant 任务

java - strings.xml 问题...无法将 R.string.foo 作为 CharSequence 传递

performance - WebSockets、UDP 和基准