무엇인가에 대한 옵션을 생성하는 사용자 친화적인 알파 숫자 Id(같은 비즈니스 id,SKU)

StackOverflow https://stackoverflow.com/questions/217253

  •  03-07-2019
  •  | 
  •  

문제

요구사항은 다음과 같습니다:

해야 합 영숫자,8-10 자는 사용자 친화적이다.이러한으로 저장됩니다 독특한 키를 데이터베이스에서.내가 사용하 Guid 를 기본 키로 그렇게 옵션을 사용하 Guid 를 생성하는 이러한 고유 Id 것이 바람직합니다.

나는 생각에선의 기초 n 컨버터는 a Guid 로 변환하는 8 개 문자 고유의 문자열입니다.

짧은,가벼운 알고리즘으로 선호하는 것은 매우 많습니다.

도움이 되었습니까?

해결책

당신은 고려할 수 있습니다 기본 36. 편지와 숫자를 할 수 있다는 점에서. 세트에서 I (눈) 및 O (OH)를 제거하여 1 (1) 및 0 (0)과 혼합되지 않도록 고려하십시오. 어떤 사람들은 약 2와 Z에 대해 불평 할 수도 있습니다.

다른 팁

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%년의 시간입니까?[유래]

문제와 GUID->문자 변환;하는 동안 당신의 GUID 를 통계적으로 독특한 복용하여 모든 하위 집합을 줄이는 임의의 기회를 증가 충돌 사고로 이어질 수 있습니다.당신은 확실히 원하지 않을 만들 non-시타딘 트라팔가 스퀘어 SKU 습니다.


솔루션 1:

을 만들 SKU 데이터를 사용하여 타당 개체와 사업 규칙이 있습니다.

즉가 될 가능성이 작은 특성의 조합을 만드는 개체의 독특한 (자연적인 열쇠).의 요소를 결합하여 자연의 핵심,인코딩 및 압착기를 만들 SKU.자주 당신이 필요로하는 모든 날짜간 분야(예 CreationDate)및 다른 속성을 달성했다.가능성이 있어 많은 구멍에 sku 생성하지만,sku 의 관련성이 더 높를 사용자에게 있습니다.

가정:

Wholesaler, product name, product version, sku
Amazon,     IPod Nano,    2.2,             AMIPDNN22
BestBuy,    Vaio,         3.2,             BEVAIO32

솔루션 2:

는 방법을 보유고의 범위는 다음과 진행을 놓을 순차적으로 반환하지 않 동일 번호에 두 번.할 수 있습으로 끝날에 구멍이 있습니다.가능성할 필요는 없지만 생 sku 의하는 문제되지 않도록 주의하십시오 당신의 요구 사항을 허용합니다.

구현하는 것입 key 테이블에서 데이터베이스가 있는 카운터입니다.카운터가 증가에 트랜잭션이 있습니다.중요한 요점은 그 보다는 오히려 증가에 의한 1 일 방법에서 소프트웨어 잡고 있습니다.사-c#코드는 다음과 같습니다.

-- 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).이 방법은 일반적으로 생성하는 데 사용되는 기본 키가 필요 없이 데이터베이스의 id 열을,하지만 당신이 볼 수 있습니다 그것이 어떻게 적용될 수 있습니다 당신의 목적이 있다.

"사용자 친화적"을 찾고 있다면 단순히 단순히 짧거나 영숫자로 만드는 것보다 전체 단어를 사용해 보려고 할 수 있습니다. 따라서 다음과 같은 것입니다.

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

재미있는 것입니다. 그렇지 않으면, GUID의 GUID 또는 SHA1/MD5 해시의 첫 8-10자를 취하는 것이 아마도 가장 좋은 방법 일 것입니다.

작동 할 수있는 가장 간단한 것은 값이 필요할 때마다 증가하는 카운터입니다. 8 개 (왼쪽-제로 패딩) 자릿수는 9999999 년까지 00000000 가능한 값을 제공합니다 (000-000-00에서와 같이 인간의 가독성을 위해 공간이나 하이픈을 개선 할 수 있지만).

1 억 명 이상의 값이 필요한 경우 길이를 늘리거나 대체 위치에서 문자를 사용할 수 있습니다. A0A0A0A0을 사용하여 Z9Z9Z9Z9를 사용하면 4,569,760,000 개 이상의 가능한 값 (4,569,760,000)이 제공됩니다. 긴 정수를 가져 와서 그러한 인코딩 (가장 오른쪽 숫자의 경우 Mod 10, Div x 10, 가장 오른쪽 문자의 경우 Mod 26 등)을 생성하는 것은 사소한 코드입니다. 카운터를 모드 260 배열로 변환하고 각 모드 260 값을 인덱스로 사용하여 "A0", "A1", "A2"등을 "A9", "로 사용하는 것입니다. B0 ","B1 "등"Z9 ").

기본 36 (다른 답변에서 언급)의 문제점은 비슷한 캐릭터 (1 vs. I, Zero vs. O, Two vs. Z, 5 vs. S)의 독자 혼란뿐만 아니라 조합에 대해 걱정해야한다는 것입니다. 독자들이 철자가 불쾌하거나 외설적 인 단어 나 약어로 인식 될 수있는 인접한 글자.

CRC32 해싱 알고리즘을 시도 할 수 있습니다. CRC32는 8 문자열을 생성합니다.

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

http://textop.us/hashing/crc

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top