Каковы опции для генерации удобной для пользователя альфы числовые идентификаторы (как бизнес-идентификатор, SKU)

Git ведет себя так, как и должно быть.

Для вашей ситуации вы можете удалить файл за один коммит в другую ветку. Другие коммиты будут такими, какими они должны быть. Затем, вместо слияния other_branch с мастером, вы можете выбрать коммиты other_branch в главную ветку без коммита удаления.

Надеюсь, ты получил ответ.

16
задан Mank 20 October 2008 в 00:56
поделиться

5 ответов

Вы могли бы рассмотреть основа 36. в этом это может сделать буквы и числа. Рассмотрите удаление I (глаз) и O (О), от Вашего набора, таким образом, они не становятся путавшими с 1 (один) и 0 (нуль). Некоторые люди могли бы жаловаться приблизительно 2 и Z также.

8
ответ дан 30 November 2019 в 21:29
поделиться

Можно хотеть попробовать алгоритм хеширования CRC32. CRC32 генерирует 8 символьных строк.

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

http://textop.us/Hashing/CRC

2
ответ дан 30 November 2019 в 21:29
поделиться

Самой простой вещью, которая могла возможно работать, является счетчик, который увеличен каждый раз, когда значение требуется. Восемь (left-zero-padded) цифр дают Вам 100 миллионов возможных значений 00000000 до 99999999 (хотя Вы могли бы прервать пробелы или дефисы для удобства чтения, как в 000-000-00).

при необходимости больше чем в 100 миллионах значений Вы могли бы или увеличить длину или использовать буквы в альтернативных положениях. Используя A0A0A0A0 через Z9Z9Z9Z9 дает Вам по four-and-a-half миллиарду возможных значений (4,569,760,000) доступный. Это - тривиальный бит кода, чтобы взять длинное целое и произвести такое кодирование (модификация 10 для самой правой цифры, отделения 10 затем модификация 26 для самой правой буквы, и т.д.), Если у Вас есть память для записи, самый быстрый путь состоит в том, чтобы преобразовать в противоречии с модификацией 260 массивов и использовать каждую модификацию 260 значений в качестве индекса в массив двух символьных строк ("A0", "A1", "A2", и так далее через "A9", "B0", "B1", и т.д. через "Z9").

проблема с основой 36 (упомянутый в другом ответе) состоит в том, что не только необходимо волноваться о беспорядке читателя подобных символов (один по сравнению со Мной, обнулите по сравнению с O, два по сравнению с Z, пять по сравнению с S), но также и о комбинациях смежных букв, которые могли бы быть восприняты читателями как то, чтобы произносить неприятные или непристойные слова по буквам или сокращения.

3
ответ дан 30 November 2019 в 21:29
поделиться

Если Вы ищете "удобный для пользователя", Вы могли бы хотеть попытаться использовать все слова вместо того, чтобы просто делать это short/alphanumberic, таким образом, чем-то как:

words = [s.strip().lower() for s in open('/usr/share/dict/canadian-english') if "'" not in s]
mod = len(words)

def main(script, guid):
    guid = hash(guid)

    print "+".join(words[(guid ** e) % mod] for e in (53, 61, 71))

if __name__ == "__main__":
    import sys
    main(*sys.argv)

, Который производит вывод как:

oranjestad+compressing+wellspring
padlock+discommoded+blazons
pt+olenek+renews

, Который забавен. Иначе просто взятие первых 8-10 символов гуида или sha1/md5 хеша гуида является, вероятно, Вашим лучшим выбором.

3
ответ дан 30 November 2019 в 21:29
поделиться
8 characters - perfectly random - 36^8 = 2,821,109,907,456 combinations
10 characters - perfectly random - 36^10 = 3,656,158,440,062,976 combinations
GUID's - statistically unique* - 2^128 = 340,000,000,000,000,000,000,000,000,000,000,000,000 combinations

* GUID уникальные 100% времени? [stackoverflow]

проблема с Вашим GUID-> преобразование символов; в то время как Ваш GUID статистически уникален, путем взятия любого подмножества Вы уменьшаете случайность и увеличиваете шанс коллизий. Вы, конечно, не хотите создавать non-unqiue SKU's.

<час>

Решение 1:

Создают SKU использование данных, относящихся к объектным и бизнес-правилам.

т.е. Там вероятно, чтобы быть небольшой комбинацией атрибутов, которая делает объект уникальным (естественный ключ) . Объедините элементы естественного ключа, закодируйте и сожмите их для создания SKU. Часто все, в чем Вы нуждаетесь, является полем даты и времени (т.е. CreationDate) и несколько других свойств для достижения этого. У Вас, вероятно, будет много дыр в sku создании, но sku's более относится к Вашим пользователям.

гипотетически:

Wholesaler, product name, product version, sku
Amazon,     IPod Nano,    2.2,             AMIPDNN22
BestBuy,    Vaio,         3.2,             BEVAIO32
<час>

Решение 2:

метод А, который резервирует диапазон чисел, и затем продолжает выпускать их последовательно и никогда не возвращает то же число дважды. Можно все еще закончить с дырами в диапазоне. Вероятно, хотя Вы не должны генерировать достаточно sku's, чтобы иметь значение, но гарантировать, чтобы Ваши требования допускали это.

реализация должна иметь key таблица в базе данных, которая имеет счетчик. Счетчик увеличен в транзакции. Важный момент - то, что вместо того, чтобы увеличить 1, метод в программном обеспечении захватывает блок. pseudo-c#-code следующие.

-- what the key table may look like
CREATE TABLE Keys(Name VARCHAR(10) primary key, NextID INT)
INSERT INTO Keys Values('sku',1)

// some elements of the class
public static SkuKeyGenerator 
{
    private static syncObject = new object();
    private static int nextID = 0;
    private static int maxID = 0;
    private const int amountToReserve = 100;

    public static int NextKey()
    {
        lock( syncObject )
        {
            if( nextID == maxID )
            {
                ReserveIds();
            }
            return nextID++;
        }
    }
    private static void ReserveIds()
    {
        // pseudocode - in reality I'd do this with a stored procedure inside a transaction,
        // We reserve some predefined number of keys from Keys where Name = 'sku'
        // need to run the select and update in the same transaction because this isn't the only
        // method that can use this table.
        using( Transaction trans = new Transaction() ) // pseudocode.
        {
             int currentTableValue = db.Execute(trans, "SELECT NextID FROM Keys WHERE Name = 'sku'");
             int newMaxID = currentTableValue + amountToReserve;
             db.Execute(trans, "UPDATE Keys SET NextID = @1 WHERE Name = 'sku'", newMaxID);

             trans.Commit();

             nextID = currentTableValue;
             maxID = newMaxID;
        }
    } 

идея здесь состоит в том, что Вы резервируете достаточно ключей так, чтобы Ваш код часто не шел база данных, поскольку получение диапазона ключей является дорогой операцией. У Вас должна быть хорошая идея количества ключей, которые необходимо зарезервировать для балансировки ключевой потери (перезапуск приложения) по сравнению с исчерпывающими ключами слишком быстро и возвращением к базе данных. Эта простая реализация не имеет никакого способа снова использовать потерянные ключи.

, поскольку эта реализация полагается база данных и транзакции, у Вас могут быть приложения, работающие одновременно и все генерируют уникальные ключи, не будучи должен часто переходить к базе данных.

вышеупомянутое Примечания свободно основано key table, страница 222 от Шаблоны Архитектуры приложений для предприятия (Fowler) . Метод обычно используется для генерации первичных ключей без потребности столбца идентификационных данных базы данных, но Вы видите, как это может быть адаптировано к Вашей цели.

10
ответ дан 30 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: