#java #хеширование
Хотелось бы раз и навсегда выяснить, что лучше и целесообразнее использовать в виде ключа в хэш-коллекциях String или UUID? Mapmap = ... Map map = ...
Ответы
Ответ 1
Можно посмотреть на реализации функций hashCode в классах String и UUID. Для String: /** * Returns a hash code for this string. The hash code for a *String
object is computed as ** using* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] *int
arithmetic, wheres[i]
is the * ith character of the string,n
is the length of * the string, and^
indicates exponentiation. * (The hash value of the empty string is zero.) * * @return a hash code value for this object. */ public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; } Для UUID: /** * Returns a hash code for this {@code UUID}. * * @return A hash code value for this {@code UUID} */ public int hashCode() { long hilo = mostSigBits ^ leastSigBits; return ((int)(hilo >> 32)) ^ (int) hilo; } Можно видеть, что для UUID вычисления хэша происходит очень быстро, с помощью битовых операций над полями. Для String хэш вычисляется путём прохода по каждому символу строки. Но это происходит для каждого объекта только один раз. После того, как хэш уже был однажды вычислен, он просто хранится в поле класса и возвращается, если он нужен. При этом нужно отметить разницу в подходах хранения данных в этих классах. В классе String строка хранится как массив значений char. А в классе UUID в двух полях типа long. Вследствие этого, объект типа String, хранящий UUID, будет занимать куда больше места, чем сам UUID. В строке будет около 36 символов, т.е. 72 байта, плюс расходы на хранение, например, длины строки. В то время как в UUID это будет всего 16 байт. Таким образом, если вы хотите использовать не очень много ключей, но при этом обращение по ним может быть частым, можно использовать String. В остальных случаях, особенно, если вам нужно хранить очень много разных ключей, однозначно лучше использовать UUID.
Комментариев нет:
Отправить комментарий