Возможно, вы захотите также рассмотреть класс java.util.concurrent.FutureTask
.
Если вы используете Java 5 или более позднюю версию, FutureTask - это реализация «подстановочного асинхронного вычисления» под ключ. "
Есть еще более богатые асинхронные действия по планированию выполнения, доступные в пакете java.util.concurrent
(например, ScheduledExecutorService
), но FutureTask
могут иметь все необходимые вам функции.
Я даже зашел так далеко, чтобы сказать, что уже не рекомендуется использовать первый образец кода, который вы дали в качестве примера с тех пор, как FutureTask
стал доступен. (Предполагая, что вы находитесь на Java 5 или новее.)
Вероятность всего двух хешей, случайно сталкивающихся, 1/2 <глоток> 128 глоток> , который является 1 в 340 нониллионах undecillion 282 decillion 366 920 октильонов 938 септильонов 463 секстильона 463 квинтильона 374 квадрильона 607 триллионов 431 миллиард 768 миллионов 211 тысяч 456.
Однако, если Вы сохраняете все хеши тогда, вероятность немного выше благодаря парадокс дня рождения . Для имения 50%-го шанса любого хеша, сталкивающегося с любым другим хешем, Вам нужно 2 <глоток> 64 глоток> хеши. Это означает, что для получения коллизии, в среднем, необходимо будет хешировать 6 миллиард файлы в секунду в течение 100 лет .
Поэтому ожидайте, он:
md5(filename) + timestamp
или:
md5(filename + timestamp)
, Если бы первый, Вы - большая часть пути к GUID, и я не волновался бы об этом. Если последний, то см. сообщение Karg о том, как Вы столкнетесь с коллизиями в конечном счете.
В то время как были получившие широкую огласку проблемы с MD5 из-за коллизий, НЕУМЫШЛЕННЫЕ коллизии среди случайных данных чрезвычайно редки . С другой стороны, если бы Вы хешируете на имени файла, это не случайные данные, и я ожидал бы коллизии быстро.
Действительно не имеет значения, как, вероятно, это; это возможно. Это могло произойти на первых двух вещах, которые Вы хешируете (очень вряд ли, но возможный), таким образом, необходимо будет поддерживать коллизии с начала.
Грубое эмпирическое правило для коллизий является квадратным корнем диапазона значений. Ваш сигнал MD5, по-видимому, 128 битов длиной, таким образом, Вы собираетесь быть вероятными видеть коллизии выше и вне 2^64 изображения.
S3 может иметь подкаталоги. Просто поместите "/" в ключевое имя, и можно получить доступ к файлам, как будто они были в отдельных каталогах. Я использую это, чтобы хранить пользовательские файлы в отдельных папках на основе их идентификатора пользователя в S3.
, Например: "mybucket/users/1234/somefile.jpg". Это не точно то же как каталог в файловой системе, но S3 API имеет некоторые функции, которые позволяют ему работать почти то же. Я могу попросить, чтобы он перечислил все файлы, которые начинаются "с пользователей/1234 /" и это покажет мне все файлы в том "каталоге".
Хотя случайные коллизии MD5 чрезвычайно редки, если ваши пользователи могут предоставлять файлы (которые будут храниться дословно), они могут спроектировать возникновение коллизий. То есть они могут намеренно создать два файла с одинаковой суммой MD5, но с разными данными. Убедитесь, что ваше приложение может обрабатывать этот случай разумным образом, или, возможно, используйте более сильный хэш, например SHA-256.