Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用字符串哈希代码作为etag安全吗_Java_Jersey_Probability - Fatal编程技术网

Java 使用字符串哈希代码作为etag安全吗

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

给定某个输入参数,对于RESTAPI,我希望使用hashcode作为etag。 json响应发生变化且哈希代码相同的概率是多少

或者,有没有更好的方法来做到这一点

@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!" )