Guid.NewGuid (). GetHashCode () для БД - PullRequest
       43

Guid.NewGuid (). GetHashCode () для БД

5 голосов
/ 23 февраля 2010

Будет ли это надежно для использования в качестве идентификатора для хранения данных (SQL Server)?

Я бы использовал guid, но я бы предпочел числовое значение.

Ответы [ 7 ]

4 голосов
/ 23 февраля 2010

A guid более вероятно представляет запись уникально , чем numeric value.

Наряду с:

  • GUID обеспечивают глобальную уникальность
  • GUID можно перемещать по базам данных хорошо
  • GUID уменьшает количество объединений требуется

См. Это: Guid или Int первичный ключ?

3 голосов
/ 23 февраля 2010

Если вы хотите числовое значение, используйте столбец IDENTITY. Если вам нужен GUID, используйте uniqueidentifier. Все просто.

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

3 голосов
/ 23 февраля 2010

Настоящий GUID разработан, чтобы быть уникальным. Когда вы уменьшаете это до типа int (через GetHashCode), вероятность его уникальности уменьшается.

Есть одна веская причина использовать GUID (уникальность), и этот код удаляет эту функцию GUID.

3 голосов
/ 23 февраля 2010

Будет ли это надежным для использования в качестве идентификатора для хранения данных (SQL Server)?

Нет. GUID 128-битные, но хэш-коды 32-битные. Поэтому обязательно происходят столкновения. Маловероятно, что вы когда-либо сталкиваетесь с ним, но вам не гарантировано, что вы никогда не встретите его.

То, что вы хотите для надежности, является гарантией того, что вы никогда не столкнетесь с столкновением. Если вы настаиваете на использовании Guid.NewGuid().GetHashCode(), вам нужно добавить логику для обнаружения коллизий. У GUID есть свои преимущества (и недостатки), но без дополнительной информации я бы предложил использовать автоматически увеличивающийся столбец int. Тем более, что вы говорите, что хотите числовой столбец, я бы склонялся к использованию IDENTITY.

1 голос
/ 23 февраля 2010

Я бы сказал, просто используйте GUID в качестве значения в столбце. Тогда никаких проблем.

0 голосов
/ 23 февраля 2010
Dim bom As New Dictionary(Of Long, Boolean)

Sub pageload() Handles Me.Load
    For i = 0 To 500
        Dim act As New Action(AddressOf collisionfind)
        act.BeginInvoke(Nothing, Nothing)
    Next
End Sub

Sub collisionfind()
    For index = 1 To 50000000
        Dim INTGUID = Guid.NewGuid.GetHashCode / 2 * Guid.NewGuid.GetHashCode / 2
        bom.Add(INTGUID, Nothing)
    Next
End Sub

Ну, в конце концов, это почти так же хорошо.

Нет столкновений: D.

50000000 Петли на 500 потоков довольно тяжелые.Это достаточно хорошо для меня.

0 голосов
/ 23 февраля 2010

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

Убедитесь, что тип данных вашего первичного ключа - UNIQUEIDENTIFIER, и все готово.

...