Zeus
Zeus

Reputation: 432

Generate a 16 digit unique Hexadecimal value from given string of numbers

How would I go about doing that? I tried using SHA-1 and MD5 but the output is too long for my requirements and truncation would not make it unique.

Input : String containing numbers e.g. (0302160123456789)

Received output : 30f2bddc3e2fba9c05d97d04f8da4449

Desired Output: Unique number within range (0000000000000000 - FFFFFFFFFFFFFFFF) and 16 characters long

Any help/ pointers are greatly appreciated.

Upvotes: 1

Views: 5205

Answers (3)

Artjom B.
Artjom B.

Reputation: 61952

How big is your input domain? If it is bigger than your output domain, then the Pigeon Hole principle applies and you can't get unique output by definition.

If the input domain is smaller or equal to the output domain, then you can easily accomplish this with a Pseudo-Random Permutation (PRP) that block ciphers provide.

The output of 16 hexits is equivalent to 8 bytes and equivalent to 64 bit. DES (and Triple DES) is a block cipher that has this block size.

  1. Parse the input string to a byte array in a compact fashion. If the input always consists of numerical digits, you can use Ebbe M. Pedersen's approach with

    byte[] plaintext = new BigInteger("0302160123456789").toByteArray();
    
  2. Then you can generate some random, but fixed key of 24 bytes for Triple DES and instantiate the cipher with:

    Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DESede"));
    byte[] ciphertext = c.doFinal(plaintext);
    
  3. Use some kind of Hex converter to get the representation you want.

You can "hash" numbers up to 36028797018963968 with this. If you want larger numbers (up to 9223372036854775808), then you need to use "DESede/ECB/NoPadding" and pad yourself with some padding bytes.

Upvotes: 2

Ebbe M. Pedersen
Ebbe M. Pedersen

Reputation: 7518

You could just convert your number to hex using BigInteger like this:

String id = new BigInteger("0302160123456789").toString(16);
System.out.println(id);

That gives:

112d022d2ed15

Upvotes: -1

gpasch
gpasch

Reputation: 2682

are you going to receive more than FFFFFFFFFFFFFFFF different strings?

if not then it's a simple problem of generating integers: the first string will get 0 the next 1 etc; you just keep a list of the strings and check if something the same appears.

Upvotes: 1

Related Questions