1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.sw4j.sample.memory.heap;
18
19 import java.security.MessageDigest;
20 import java.security.NoSuchAlgorithmException;
21 import java.util.Random;
22 import java.util.logging.Logger;
23
24
25
26
27
28 public class Allocator {
29
30
31 private static final int kiByte = 1024;
32
33 private static final Logger logger = Logger.getLogger(Allocator.class.getName());
34
35 private byte[] data;
36
37 private byte[] digest;
38
39 private final Random rand = new Random();
40
41
42
43
44
45
46 public Allocator(int blocks) {
47 data = new byte[blocks * kiByte];
48 }
49
50 public void calculateHash() throws NoSuchAlgorithmException {
51 byte[] filler = new byte[kiByte];
52 for (int i = 0; i < data.length / kiByte; i++) {
53 rand.nextBytes(filler);
54 System.arraycopy(filler, 0, data, kiByte * i, kiByte);
55 }
56 String digestAlgorithm = "SHA3-512";
57 String javaVersion = System.getProperty("java.specification.version");
58 try {
59 double version = Double.parseDouble(javaVersion);
60 if (version < 9.0d) {
61 logger.config("Pre Java 9 VM detected.");
62 digestAlgorithm = "SHA-512";
63 } else {
64 logger.config("Post Java 8 VM detected.");
65 }
66 } catch (NumberFormatException nfex) {
67 logger.config(String.format("Unknown Java version: %s.", javaVersion));
68 digestAlgorithm = "SHA-512";
69 }
70 logger.config(String.format("Using hash algorithm %s", digestAlgorithm));
71 MessageDigest digester = MessageDigest.getInstance(digestAlgorithm);
72 digest = digester.digest(data);
73 }
74
75 public String getHash() {
76 StringBuilder sb = new StringBuilder();
77 for (int i = 0; i < digest.length; i++) {
78 sb.append(String.format("%02x", digest[i]));
79 }
80 return sb.toString();
81 }
82
83
84
85
86
87
88 }