2015-05-21 5 views
-1

У меня есть объекты со следующими свойствами:Хеширующий алгоритм для создания уникальных идентификаторов?

class MyObject 
{ 
    int sourceId(); 
    String id(); 
} 

Если я использую id в качестве идентификатора, не может быть коллизии, поскольку могут быть записи с одинаковыми id, но разные sourceId

Поэтому я ищу в создание хеша sourceId и id и использование этого для генерации уникальных идентификаторов для каждой записи. Я думал только о md5ing String.valueOf(sourceId + id), но кажется, что столкновения md5 не так уж необычны, как хотелось бы.

Какой другой алгоритм был бы рекомендован для этого, что-то, что создает быстрый хеш, и где также было бы невероятно, чтобы произошло столкновение?

+0

UUID бы помочь в этом случае? Вероятность столкновения была бы очень маленькой, но вам также пришлось бы принять длину исправления для id, так как UUID не может быть сокращен. – hamena314

+0

SHA1, SHA256, SHA512, многие из них – thinker

+0

@ hamena314 Он не может использовать UUID, поскольку мне также нужна возможность обратного генерации идентификатора из 'sourceId' и' id' –

ответ

3

Если id() строка имеет фиксированную длину, вы можете просто сцепить SourceId и Id:

public String getUniqueID() 
{ 
    return sourceID() + id(); 
} 

Если id() не имеет фиксированную длину, вы можете подушечка нулями (например) чтобы получить фиксированную длину, а затем объединить ее до sourceID(), как и раньше.

+0

Это хорошее решение, но я бы предпочел бы их хэш, так как это не будет раскрывать базовые значения в URL-адресах и т. Д. Любая рекомендация для хэш-алгоритма? –

+0

@ClickUpvote Это зависит от количества требуемой «безопасности». Если этого достаточно, чтобы сделать уникальный идентификатор менее очевидным для невооруженного глаза, вы можете сделать что-то простое. Например, если id() содержит только числовые символы, вы можете сделать базовые значения менее очевидными, кодируя уникальный идентификатор в некоторой более высокой базе (шестнадцатеричный или даже базовый 64). Если вам требуется повышенная безопасность, вам придется использовать один алгоритм хэширования, так что вы также не сможете восстановить базовые значения. Это то, что вы хотите? – Eran

+0

Это не должно быть нерушимым. Но меня беспокоят столкновения. Я не хочу, чтобы две разные команды id/sourceId отображали один и тот же хэш. –

1

Предполагая, что это значение может быть строка, я бы просто сцепить оба значения с дефисом:

class MyObject 
{ 
    int sourceId; 
    String id; 
    String getUniqueKey() { 
     return sourceId+"-"+id; 
    } 
} 

Тогда вы можете получить исходные значения с помощью value.split("-");

+0

Проблема в том, что в 'String id()' могут быть дефисы, что может вызвать конфликты. Поэтому я считаю, что необходим алгоритм хэширования. –

+1

Если номер (sourceId) помещен как первая часть, то первым хипеном будет разделитель, любой другой будет частью значения «id». В любом случае, если вы не хотите раскрывать это значение, это не то решение, которое вы ищете, если только вы его не рассматриваете (я думаю о Base64) –

Смежные вопросы