Tag Archives: UUID

[NoSQL/Cassandra] PHPCassa 에서 TimeUUIDType을 어떻게 활용하는가?

사용자 삽입 이미지
별거 아닌 내용을 적어보려고 합니다. 하지만 처음 접할때 생각보다 어려웠던 기억이 나는군요. 이 글을 보시기 전에 PHPCassa에 대한 이해가 필요합니다. [이글]을 먼저 보시길 추천합니다.

Cassandra에는 기본적으로 TimeUUIDType이라는 것이 존재합니다. 이 타입을 이용하여 여러개의 컬럼키들을 시간순으로 정렬하는것이 가능해집니다. 기존의 MySQL등에서는 Auto Increment 옵션을 사용하여 Unique한 PK를 만들어냅니다만 Cassandra에서는 이 TimeUUIDType을 이용하여 사실상 거의 중복되지 않는 키값을 만들어 낼 수 있습니다.

그렇다면 이제 이 키값을 이용하여 서버-클라이언트간에 주고 받을 수 있어야 하는데요, 이것이 생각보다 간단하지 않습니다.(사실 알고보면 간단합니다만;) 우선 소스코드부터 보여드리겠습니다.
[code]// 1. 새로운 UUID를 생성
$newUUID = CassandraUtil::uuid1();
echo “<p>새로운 UUID생성: $newUUID</p>”;

// 2. 클라이언트/서버와 주고받을때 사용할 수 있는 문자형태로 변환
$strUUID = strval(CassandraUtil::import($newUUID));
echo “<p>식별가능한 문자열UUID로 변경: $strUUID</p>”;

// 3. 다시 바이너리 형태의 UUID로 변경
$importedUUID = CassandraUtil::import($strUUID)->bytes;
echo “<p>바이너리 형태의 UUID로 변경: $importedUUID</p>”;[/code]
위의 코드는 현재의 시간(64bit microtime)을 이용하여 UUID를 생성한 다음 그것을 서버-클라이언트간에 식별하기 쉬운 문자열로 바꾼후에 다시 그 문자열을 Cassandra에서 바로 사용할 수 있는 형태로 되돌리는 과정을 수행합니다. 위의 코드는 아래와 같은 결과를 보여줍니다.

사용자 삽입 이미지
첫번째와 마지막이 사실상 같다는 것을 알 수 있습니다. Cassandra에서는 기본적으로 이 Binary형태의 값을 사용합니다. 하지만 개발자가 사용하기 어렵고 이렇게 생성된 값을 서버/클라이언트간 주고 받는다고 해도 생각해볼점이 많아집니다. 이 경우 두번째와 같은 형태로 변경하여 사용할 수 있습니다.

[Java/Android] 유니크한 디바이스 아이디값 만들기

디바이스를 식별하기 위해 Unique Device ID값이 필요할 때가 있습니다. 쉽게 생각하면 아이폰에는 UDID(Unique Device Identifier)가 있습니다. 하지만 안드로이드에는 생각보다 간단한 문제가 아니더군요. 예를 들면 다음과 같은 방법으로 유니크한 시리얼 정보를 읽어올 수 있습니다.

Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);

하지만 위의 방법은 때에따라 빈 값이 반환되는 경우가 있다고 합니다. (저도 경험해보진 않았음) 또한 안드로이드 디바이스는 제조사에서 커스터마이징을 대책없이 하는 경우가 많아 어떤값이 나올지 일관성도 유지하기가 어렵습니다.

그렇다면 몇가지 값을 조합해서 유니크한 시리얼을 만든다면 어떨까요? 좀 더 안정적으로 사용할 수 있지 않을까 생각합니다.

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();

위와같이 3가지 값을 조합하여 사용할 경우 좀 더 정확도 높은 유니크한 값을 만들어낼 수 있습니다.
사용자 삽입 이미지이런식으로 값이 출력됩니다. [샘플코드다운로드]

참고: http://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id