Java 使用字符串哈希代码作为etag安全吗
给定某个输入参数,对于RESTAPI,我希望使用hashcode作为etag。 json响应发生变化且哈希代码相同的概率是多少 或者,有没有更好的方法来做到这一点Java 使用字符串哈希代码作为etag安全吗,java,jersey,probability,Java,Jersey,Probability,给定某个输入参数,对于RESTAPI,我希望使用hashcode作为etag。 json响应发生变化且哈希代码相同的概率是多少 或者,有没有更好的方法来做到这一点 @GET public Response getConfigurationForView(@PathParam("in1") String in1, @Context Request request) throws Exception { String jsonResponse = getJsonRespons
@GET
public Response getConfigurationForView(@PathParam("in1") String in1, @Context Request request) throws Exception {
String jsonResponse = getJsonResponse(in1);
EntityTag etag = new EntityTag(Integer.toString(in1.hashCode()) + "-" + Integer.toString(jsonResponse.hashCode()));
ResponseBuilder builder = request.evaluatePreconditions(etag);
if(builder == null){
builder = Response.ok(jsonResponse, MediaType.APPLICATION_JSON);
builder.tag(etag);
}
return builder.build();
}
考虑到所有种类的字符串只有40亿个可能的哈希代码,最终可能会遇到ETag冲突 查看如何实现
String.hashCode()
:
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
这将产生与sha1sum
实用程序相同的输出。
您还可以使用biginger
将字节缓冲区转换为十六进制字符串:
new BigInteger(1, digest.digest()).toString(16)
--但是
javax.xml.bind.DatatypeConverter.printHexBinary()
要快好几倍。如果您可以使用jdk8+和Google Guava,您可以试试
final String myETag = ( (Set<Object>) this.setOfChangeableProperties ).stream()
.filter( Objects::nonNull )
.map( Objects::toString )
.reduce( (a,b) -> a.concat(b) )
.map( s -> Hashing.md5().hashUnencodedChars( s ).toString() )
.orElse( "nothing of interest to hash!" )
final String myETag=((Set)this.setOfChangeableProperties).stream()
.filter(对象::非空)
.map(对象::toString)
.reduce((a,b)->a.concat(b))
.map->Hashing.md5()
.orElse(“没有什么有趣的东西要散列!”)
请看这个问题:据我所知,引用的帖子是关于字符串的哈希代码在不同版本的java中是否相同。我想问的是,对于两个不同的字符串,我得到相同哈希代码的概率是多少。注意:哈希代码可能是负数。有时字符串不应包含连字符。我们可以使用DigestUtils:来创建md5或sha1
final String myETag = ( (Set<Object>) this.setOfChangeableProperties ).stream()
.filter( Objects::nonNull )
.map( Objects::toString )
.reduce( (a,b) -> a.concat(b) )
.map( s -> Hashing.md5().hashUnencodedChars( s ).toString() )
.orElse( "nothing of interest to hash!" )