как генерировать уникальные числа длиной менее 8 символов - PullRequest
1 голос
/ 28 марта 2010

Я хочу генерировать уникальный идентификатор каждый раз, когда я вызываю methodde generateCustumerId (). Сгенерированный идентификатор должен быть длиной 8 символов или менее 8 символов. Это требование необходимо, потому что мне нужно сохранить его в файле данных, и для этого идентификатора определена длина 8 символов.

Вариант 1 работает нормально. Вместо варианта 1 я хочу использовать UUID. Проблема в том, что UUID генерирует идентификатор, который имеет много символов. Кто-нибудь знает, как создать уникальный идентификатор, который меньше, чем 99999999?

вариант 1

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class CustomerIdGenerator {

private static Set<String> customerIds = new HashSet<String>();
private static Random random = new Random();

// XXX: replace with java.util.UUID
public static String generateCustumerId() {

    String customerId = null;
    while (customerId == null || customerIds.contains(customerId)) {
        customerId = String.valueOf(random.nextInt(89999999) + 10000000);
    }
    customerIds.add(customerId);
    return customerId;
}

}

option2 генерирует уникальный идентификатор, который слишком длинный

 public static String generateCustumerId() {
    String ownerId = UUID.randomUUID().toString();
    System.out.println("ownerId " + ownerId);
    return ownerId
}

Ответы [ 4 ]

2 голосов
/ 28 марта 2010

Возможно, проект Commons Id пригодится. Алфавитно-цифровой генератор (и другие их генераторы) принимает аргумент длины. Конечно, это действительно просто поддерживает последовательность (что означает, что вам придется знать / определять последний самый высокий идентификатор при перезапуске приложения).

Кроме того, вы можете попробовать что-то вроде контрольной суммы CRC-32 по местному времени или случайно сгенерированного массива байтов (CRC32 встроен в стандартную библиотеку Java ).

1 голос
/ 29 марта 2010

Сохраните постоянный счетчик, который увеличивается на единицу каждый раз, когда запрашивается новый идентификатор.

Если файл данных представляет собой таблицу SQL, вы всегда можете выбрать MAX (id) + 1 и использовать его, но вы должны быть абсолютно уверены, что не столкнетесь с проблемами многозадачности, когда два идентификатора необходимы одновременно (и они оба имеют одинаковое значение от MAX (id)). Обратите внимание, что большинство баз данных имеют собственный тип данных, разработанный для этой цели, и для любой нетривиальной программы вы должны использовать это средство.

1 голос
/ 29 марта 2010

Должен ли он быть уникальным или случайным?Если он должен быть уникальным, вы можете загрузить самое высокое значение из хранилища данных при запуске приложения (при условии, что в файл данных записывается только одно приложение).У вас есть самое высокое значение:

public class IdGenerator{
  private String value;

  public IdGenerator( String initial value ){
    this.value = value;
  }

  public synchronized String nextValue(){
    value = incrementValue( value );
    return value;
  }

  private static String nextValue( String currentValue ){
    // Somehow increment the value.
    return incrementedValue;
  }

}

В зависимости от того, какие символы вы разрешаете использовать, вы можете сделать это различными способами.Я прочитал бы последний символ текущей строки, проверил, является ли он последним разрешенным символом.Это так, увеличить 7-й символ и так далее.Иначе, увеличить последний символ.

1 голос
/ 28 марта 2010

Не лучшее решение в мире, но как насчет нарезки uuid по длине? Он не будет глобально уникальным - просто имейте в виду, что вы не получите глобально уникальный идентификатор - но он может работать для локально уникального.

...